1

我无法弄清楚为什么 getline 在一个 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;
}

我真的很感激一些帮助。我只是在学习,上面的例子来自我的测试书。

4

2 回答 2

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";
}

正确性:

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

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

噪音:

  • 构造ifstream函数获取文件名并已经打开文件。用它。

  • 在其ifstream析构函数中进行清理,无需显式执行此操作。完成后立即使用严格的范围来关闭文件。

  • line如果您不需要它,请不要泄漏到环境范围中。

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

于 2013-01-28T08:39:58.943 回答
1

有一个实际的错误:你使用的结果getline 没有测试它是否成功。编写内部循环的常用方法是:

std::string line;
while ( std::getline( myfile, line ) ) {
    std::cout << line << std::endl;
}

其他更多的是风格问题,尽管有些问题确实享有几乎普遍的共识:例如,不要在需要之前定义变量(因此,定义 of line应该紧接在循环之前)。错误输出转到std::cerr,而不是std::out. And in case of an error, you should returnEXIT_FAILURE 0` , and not

人们也普遍接受您不必显式关闭输入(因为析构函数会处理它,并且您已经成功读取了所有内容)。对于其他人来说,共识并不完整:using namespace std;例如,我永远不会使用 ,并且我永远不会将代码 else放在同一行之后。如果 an 中较短的条件if...else是第一个,我还发现代码更具可读性,所以我会写:

if ( !myfile.is_open() ) {
    std::cout << "Unable to open file" << std::endl
    returnCode = EXIT_FAILURE;
} else {
    std::string line;
    while ( std::getline( myfile, line ) ) {
        std::cout << line << std::endl;
    }
    returnCode = EXIT_SUCCESS;
}

除了更复杂的事情,我会将文件的处理分解为一个单独的函数。所以我最终会得到类似的东西:

if ( myfile.is_open() ) {
    process( myfile );
} else {
    //  error handling...
}

但是您似乎暗示您在 std::getline未发布的代码中遇到问题。有两种明显的可能解释:您没有包含<string>,或者您忘记了std::前面的 。还有其他可能的解释,但我们必须实际查看无法准确说明问题所在的代码。

于 2013-01-28T09:17:15.397 回答