读取文本文件显示到控制台然后附加文本文件

时间:2014-06-17 11:31:38

标签: c++ file-io iostream

我有一个名字的文本文件。我想将文本文件读入流中,将其显示到控制台。完成后,它将提示用户输入他们的名字。然后它应该将它添加到文件中。

我可以让它分开做这两件事而不是一起做。 这是我的代码。

#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循环浏览文件后,位置位于我的流的末尾,所以当我尝试为其添加名称时,流中没有任何空间?

2 个答案:

答案 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;
}