用C++打开文件 - getline在第二次迭代时失败

die*_*iek 1 c++ file-io xcode

我无法弄清楚为什么getline在一个X-Code项目中工作而在另一个X-Code项目中没有.错误"没有匹配函数来调用'getline'.当我创建一个单独的cpp文件时,它编译没有问题.

  // reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
      string line;
      ifstream myfile ("example.txt");
      if (myfile.is_open())
      {
        while ( myfile.good() )
        {
          getline (myfile,line);
          cout << line << endl;
        }
        myfile.close();
      }

  else cout << "Unable to open file"; 

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我真的很感激一些帮助.我刚学习,上面的例子来自我的测试书.

Ker*_* SB 5

代码嘈杂且不正确.正确的标准习语是这样的:

#include <fstream>   // for std::ifstream
#include <string>    // for std::getline and std::string

std::ifstream myfile("example.txt");

if (!myfile) { /* error, die */ }

for (std::string line; std::getline(myfile, line); )
{
    std::cout << "Read one line: '" << line << "'\n";
}
Run Code Online (Sandbox Code Playgroud)

正确性:

  • 使用输入之前,您必须检查输入操作是否成功.否则可能是UB,当然永远不会纠正.

  • [感谢@James指出这一点:] good()不检查文件是否被打开.您可以使用!myfile.fail()或者myfile.is_open(),但只是不要打扰(见下文).

噪声:

  • ifstream构造函数将文件名和已打开文件.用它.

  • ifstream清理的析构函数,没有必要做明确.一旦完成,请使用紧密的范围来关闭文件.

  • line如果您不需要,请勿泄漏到环境范围内.

  • 不需要good()(或任何正确的替代方案).只需ifstream在布尔上下文中评估对象,以查看文件是否已成功打开.