std::ios::out
默认指定的模式。
写入开始时放弃输出文件的所有内容。
#include <iostream>
#include <fstream>
int main(){
std::ofstream ofs("output.txt", std::ios::out);
ofs << "Hello World!";
return 0;
}
在这样的程序中,指定为输出文件的文件的内容如下,而与原始内容无关。
Hello World!
std::ios::trunc
打开文件时,此模式将丢弃输出文件的所有内容。
与“std::ios::out”的唯一区别是丢弃内容的时间,这次提到的内容没有特别的区别。
#include <iostream>
#include <fstream>
int main(){
std::ofstream ofs("output.txt", std::ios::trunc);
ofs << "Hello World!";
return 0;
}
在这样的程序中,指定为输出文件的文件的内容如下,而与原始内容无关。
Hello World!
std::ios::app
在此模式下,将保留输出文件的内容,并且必须在输出文件的末尾输入。
它总是写在这里输出文件的末尾,这意味着在写入之前必须将其移动到末尾。
#include <iostream>
#include <fstream>
int main(){
std::ofstream ofs("output.txt", std::ios::app);
ofs << "Hello World!";
return 0;
}
A
B
C
D
E
假设这是输出文件的原始内容,当程序执行时,输出文件如下所示:
A
B
C
D
EHello World!
std::ios::ate
在此模式下,输出文件的内容将保留,并且可以在文件中的任何位置填充。
但是,如果数据仍处于要输入的位置,则将被替换。
此外,参考资料说它以“std::ios::ate”模式打开并同时寻求文件的末尾(简而言之,如果您在此模式下打开它并且什么都不做,它将处于与“std::ios::app”相同的状态),但“ofstream”不起作用,因此您可以按如下方式打开它。
std::ofstream ofs("file.txt", std::ios::ate | std::ios::in);
在这里,“std::ios::in”意味着以可读状态打开文件,但使用它时不必考虑太多。
接下来将介绍移动要填充的位置以及在此模式下执行的示例。
更改文件位置
当输入模式设置为“std::ios::ate”并且需要更改文件位置时,请使用“seekp”成员函数指定位置,如下所示。
ofd.seekp(相对基准的位置,基准);
当引用的位置为 0 时,可能不会写入引用的位置。
将引用中的位置视为使用键盘箭头移动光标的次数。
可以使用的职位标准如下。
std::ios::beg
文件的开头。
std::ios::end
文件的末尾。
std::ios::cur
文件中的当前位置。
程序示例
假设输出文件的原始内容如下:
A
B
C
D
E
F
G
H
I
J
为此,制定了以下计划。
#include <iostream>
#include <fstream>
int main(){
std::ofstream ofs("output.txt", std::ios::ate | std::ios::in);
ofs.seekp(std::ios::beg);
ofs << "a";
ofs.seekp(-2,std::ios::end);
ofs << "h" << "i" << std::endl;
ofs << "j";
return 0;
}
作为执行结果的输出文件的内容如下所示。
a
B
C
D
E
F
G
H
Ihi
j
简要描述该程序。
首先移动到文件的开头。 这里有一个“A”,但如前所述,它被重写为“A”,因为如果要禁运的地方有原始数据,它就会被重写。
“I”没有消失的原因是,在这个程序中,光标用左箭头从最后一个点移动两次,但在两次移动中,它只移动到“I”的背面。 由于没有任意换行符,因此“h”和“i”写在“I”之后,并且该行是新的。
这里有一个“J”,但在写“J”时被重写了。