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”时被重写了。

参考:https://tora-k.com/2019/07/07/file-output/