用C ++读取文件

时间:2010-09-10 11:54:24

标签: c++

我无法弄清楚为什么我的代码无法打开和读取文件。我错过了什么?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main (int argc, char * const argv[]) 
{
    string line;
    ifstream myfile ("input_file_1.txt");
    if (myfile.is_open())
    {
        while (!myfile.eof())
        {
            getline (myfile,line);
            cout << line << endl;
        }
    }
    else
    {
        cout << "Was unable to open the file" << endl;
    }

    return 0;
}

文件“input_file_1.txt”与我的.cpp文件位于同一目录中,并且具有读取权限。我甚至给了它777的权限,我无法阅读它。

谁能告诉我我做错了什么?我真的无法理解......

5 个答案:

答案 0 :(得分:5)

  • 尝试使用文件的完整路径
  • 查找文件的默认位置是可执行文件所在的位置,而不是源位置。

答案 1 :(得分:3)

您如何以及在何处执行您的计划?从IDE? 您可以从具有文本文件的同一目录运行该程序。 另一种可能性是使用文件的绝对路径。

答案 2 :(得分:3)

如果未指定路径,库将尝试从当前目录加载文件。您需要确保这是文件所在的位置。

此外,如果文件由另一个程序以独占方式打开,您可能无法打开该文件。确保它在其他程序(如编辑器)中仍未打开。

答案 3 :(得分:3)

其他问题:

明确测试EOF通常是错误的 最后一次有效读取(此处为getline())读取最多但没有超过EOF。然后打印该行。然后重启循环。 eof()的这些测试不会失败(因为它没有读过EOF)。然后进入循环体并尝试读取下一行(使用getline()),这会失败,因为剩下0个字节要读取(因此将line的值保留为未定义状态)。然后打印出行(未定义的值)和换行符。

    while (!myfile.eof())
    {
        getline (myfile,line);
        cout << line << endl;
    }

读取文件的正确版本是:

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

这是有效的,因为getline()返回对流的引用。布尔上下文中使用的流(如while条件)测试流是否处于错误状态(即测试EOF和其他不良情况)并返回可在上下文中使用correctyl的对象。如果流的状态为OK,则表示已成功读取并进入循环(因此允许您打印该行)。

答案 4 :(得分:0)

从您的代码(包括您的cpp)创建的二进制文件在与您的代码不同的地方执行,可能是“bin”文件夹。您可以将文件放入与可执行文件相同的文件夹中。