C++写入文件仅保存最后一行,如何实现全部内容正常写入?
问题根因
代码在逐行读取的while循环内部重复创建ofstream对象打开目标文件,ofstream默认的打开模式为ios::out | ios::trunc,每次打开都会清空文件已有内容,因此前序循环写入的内容都会被后一次的打开操作覆盖清空,最终仅保留最后一次循环写入的最后一行内容。同时原代码写入时没有补充换行符,即使内容全部写入也会出现所有行拼接在一起的问题。
修复代码(最优方案)
将输出文件的打开、关闭操作移到循环外部,全程只打开一次输出文件,逐行写入内容时补充换行符即可:
#include <iostream> #include <string> #include <fstream> #include <vector> #include <cctype> #include <array> using namespace std; int main(){ string nname; cout << "Enter new name for file" << endl; // 提示用户输入新文件名 cin >> nname; fstream myFile; myFile.open("example.txt", ios::in); // 打开待读取的源文件 if (myFile.is_open()){ cout << "Is open now" << endl << endl; string text; // 输出文件仅打开一次,放在循环外部 ofstream outfile(nname); while(getline(myFile, text,'\n')) // 逐行读取源文件内容 { cout << text << endl; // 写入内容时补充换行符,保留原文件的换行格式 outfile << text << '\n'; } // 循环结束后再关闭输出文件 outfile.close(); myFile.close(); } return 0; }
可选(不推荐)方案
如果确实需要在循环内部打开文件,可在打开时指定追加模式ios::app,避免清空已有内容,但该方案会频繁触发文件IO操作,运行效率远低于上述最优方案:
ofstream outfile(nname, ios::app);
内容的提问来源于stack exchange,提问作者AZERUL BIN BADRUL ISHAM
相关产品推荐
相关产品推荐

