ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

C++实现将内容写入文件的方法总结

C++实现将内容写入文件的方法总结 一、C语言输出内容到文件使用 C 的文件 I/O 函数例如 fopen()fprintf()fputs() 和 fwrite() 等。这些函数由 C 语言中的标准库 stdio.h 提供。1234567891011121314151617181920212223242526272829#include stdio.hintmain(){// 以写入模式打开文件FILE*fp fopen(myfile.txt,w);if(fp NULL){// 打开文件失败printf(Error opening file!\n);return1;}// 使用 fprintf() 写入字符串fprintf(fp,Hello, world!\n);// 使用 fputs() 写入字符串fputs(This is another string.\n, fp);// 使用 fwrite() 写入二进制数据intnum 42;fwrite(num,sizeof(int), 1, fp);// 关闭文件fclose(fp);return0;}在这个代码示例中我们首先使用 fopen() 函数以写入模式打开了一个文件然后使用 fprintf()fputs() 和 fwrite() 向文件写入了字符串和二进制数据最后使用 fclose() 函数关闭了文件。请注意在使用 fwrite() 函数写入二进制数据时我们需要提供要写入的数据的指针以及每个数据单元的大小和要写入的数据单元数。二、C文件输入/输出流此种是C标准的输入输出一般不会带来字符种类不同引发的问题比如宽字节和窄字节之间的区别肯能我们打开文件内容都一样但是涉及加密、编码等操作宽窄字符是有区别的这个是有教训的牢记。下面是使用 C 中的文件输入/输出流的代码示例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include fstream#include iostreamintmain(){// 以写入模式打开文件std::ofstream out(myfile.txt);if(!out){// 打开文件失败std::cerr Error opening file! std::endl;return1;}// 使用流操作符 写入字符串out Hello, world! std::endl;out This is another string. std::endl;// 使用 write() 写入二进制数据intnum 42;out.write(reinterpret_castchar*(num),sizeof(int));// 关闭文件out.close();// 以读取模式打开文件std::ifstream in(myfile.txt);if(!in){// 打开文件失败std::cerr Error opening file! std::endl;return1;}// 使用流操作符 读取字符串std::string s;in s;std::cout s std::endl;// 使用 read() 读取二进制数据in.read(reinterpret_castchar*(num),sizeof(int));std::cout num std::endl;// 关闭文件in.close();return0;}在这个代码示例中我们首先使用 ofstream 对象以写入模式打开了一个文件然后使用流操作符 向文件写入了字符串使用 write() 写入了二进制数据最后使用 close() 关闭了文件。然后我们使用 ifstream 对象以读取模式打开了同一个文件使用流操作符 读取了字符串使用 read()读取了二进制数据最后使用 close() 关闭了文件。请注意当使用 write() 写入二进制数据时我们需要将要写入的数据的指针转换为 char* 类型并提供每个数据单元的大小和要写入的数据单元数。当使用 read() 读取二进制数据时我们也需要将要读取的数据的指针转换为 char* 类型并提供每个数据单元的大小和要读取的数据单元数。另一个 C 标准库中的文件输入/输出流类型叫做 filebuf它可以通过标准输入/输出流来读写文件。例如下面是使用 filebuf 的代码示例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#include fstream#include iostreamintmain(){// 以写入模式打开文件std::filebuf fb;fb.open(myfile.txt, std::ios::out);if(!fb.is_open()){// 打开文件失败std::cerr Error opening file! std::endl;return1;}// 将文件缓冲区关联到标准输出流std::ostream out(fb);// 使用标准输出流写入字符串out Hello, world! std::endl;out This is another string. std::endl;// 使用 sputn() 写入二进制数据intnum 42;fb.sputn(reinterpret_castchar*(num),sizeof(int));// 关闭文件fb.close();// 以读取模式打开文件fb.open(myfile.txt, std::ios::in);if(!fb.is_open()){// 打开文件失败std::cerr Error opening file! std::endl;return1;}// 将文件缓冲区关联到标准输入流std::istream in(fb);// 使用标准输入流读取字符串std::string s;in s;std::cout s std::endl;// 使用 sgetn() 读取二进制数据fb.sgetn(reinterpret_castchar*(num),sizeof(int));std::cout num std::endl;// 关闭文件fb.close();return0;}在这个代码示例中我们首先使用 filebuf 对象以写入模式打开了一个文件然后将文件缓冲区关联到标准输出流使用标准输出流写入字符串使用 sputn() 写入了二进制数据最后使用 close() 关闭了文件。然后我们使用 filebuf 对象以读取模式打开了同一个文件将文件缓冲区关联到标准输入流使用标准输入流读取字符串使用 sgetn() 读取了二进制数据最后使用 close() 关闭了文件。 请注意当使用 sputn() 写入二进制数据时我们需要将要写入的数据的指针转换为 char* 类型并提供每个数据单元的大小和要写入的数据单元数。当使用 sgetn() 读取二进制数据时我们也需要将要读取的数据的指针转换为 char* 类型并提供每个数据单元的大小和要读取的数据单元数。希望这些代码示例能帮助您理解 C 中的文件输入/输出流的使用方法。三、文件输入/输出流迭代器你是不是曾经有这样的烦恼想将数组或者一堆类型一样的数据写入文件for循环太麻烦。其实要想简单有个前提就是你的数据支持迭代器例如vector这种类型C内部对其实现了迭代功能iterator那么将数据一个一个写入非常方便。在使用文件输入/输出流迭代器之前你需要先包含下面的头文件12#include fstream#include iterator然后你可以使用下面的代码来写入数据到文件这段代码会将 data 中的数据写入到文件 output.txt 中并在每个数据之间添加一个空格1234567std::ofstream out_file(output.txt);std::ostream_iteratorint out_iter(out_file, );std::vectorint data {1, 2, 3, 4, 5};std::copy(data.begin(), data.end(), out_iter);out_file.close();读取文件中的数据也很简单可以使用下面的代码这段代码会从文件 input.txt 中读取数据并将数据存储在 vector 中。文件输入/输出流迭代器很方便因为它们可以像使用普通迭代器一样使用可以很容易地编写模板代码。四、C 中的文件输入/输出流缓冲区首先你需要包含下面的头文件12#include fstream#include iostream接下来你可以使用下面的代码来写入数据到文件1234567std::ofstream out_file(output.txt);std::streambuf* buf out_file.rdbuf();intdata 123;buf-sputn((char*)data,sizeof(int));out_file.close();上面这段代码会将数据 123 写入到文件 output.txt 中。读取文件中的数据也很简单可以使用下面的代码1234567std::ifstream in_file(input.txt);std::streambuf* buf in_file.rdbuf();intdata;buf-sgetn((char*)data,sizeof(int));in_file.close();上面这段代码会从文件 input.txt 中读取一个整数并将它存储在变量 data 中。使用文件输入/输出流缓冲区可以直接操纵底层文件描述符这使得你可以实现更底层的文件操作。但是这也意味着你需要自己处理底层细节比如字节序转换等等小问题。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进