我有一个名字的文本文件。我想将文本文件读入流中,将其显示到控制台。完成后,它将提示用户输入他们的名字。然后它应该将它添加到文件中。
我可以让它分开做这两件事而不是一起做。 这是我的代码。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
fstream myfile;
string line;
string name;
myfile.open("Names.txt",ios::out | ios::in | ios_base::app);
if (myfile.is_open())
{
while( getline(myfile, line) )
{
cout << line << endl;
}
cout << "Enter your name!\n";
getline (cin, name);
myfile << name;
myfile.close();
}
else
{
cout << "file was not opened\n";
}
return 0;
}
如果我将while循环留在那里,它会将所有名称写入控制台,但不会将用户输入的名称附加到列表中。如果我取出while循环,我可以为文件添加一个名称,但当然我没有得到该文件中已有的名称列表。
我最好的猜测是,我认为它可能与以下事实有关:在使用getline循环浏览文件后,位置位于我的流的末尾,所以当我尝试为其添加名称时,流中没有任何空间?
答案 0 :(得分:6)
你的猜测是正确的。
最后一次调用getline()
(失败的那个)会在您的流上设置错误标记,这将导致任何进一步的IO尝试失败,这就是为什么文件中没有实际写入的内容。
您可以在阅读循环后重置errors flags with clear()
:
myfile.clear();
注意:强>
您还应该测试上次getline()
来电的返回值。
答案 1 :(得分:0)
刚刚讨论这个问题,即使这里有接受的答案,我认为可以使用完整的代码来展示如何使用规范的C ++文件读取循环:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
fstream myfile;
string line;
string name;
myfile.open("Names.txt",ios::out | ios::in | ios_base::app);
if (myfile.is_open())
{
while( getline(myfile, line) )
cout << line << endl;
if (file_list.eof())
file_list.clear(); //otherwise we can't do any further I/O
else if (file_list.bad()) {
std::cout << "Error occured while reading file";
return 1;
}
cout << "Enter your name!\n";
getline (cin, name);
myfile << name;
myfile.close();
}
else
{
cout << "file was not opened\n";
}
return 0;
}