从c ++中的.txt文件读取时出错

时间:2016-11-06 03:24:35

标签: c++ xcode c++11

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    //reading the text file
    ifstream inputFile("testfile1.txt");
    inputFile.open("testfile1.txt");
    while(!inputFile.eof())
    //eof till end of file, reads the txt till end of file
    {
        string str;
        getline(inputFile,str);
        cout <<str<< endl;

    }
        inputFile.close();

    return 0;
}

//我遇到的问题是它没有读取文件或其中的任何内容。什么也不做,说程序以退出代码结束:0。任何人都可以检查代码中的错误

3 个答案:

答案 0 :(得分:1)

第一个错误:您正在打开输入文件两次。根据C ++标准,关于第二个打开请求的行为(直接调用open成员):

C ++11§27.9.1.9[ifstream.members / 3]

  

void open(const char* s, ios_base::openmode mode = ios_base::in);

     

效果:致电rdbuf()->open(s, mode | ios_base::in)。如果那个功能   不返回空指针调用clear(),否则调用   setstate(failbit)(可能会抛出ios_base :: failure(27.5.5.4))。

因此提出问题,rdbuf()->open(...)做了什么?好吧,std::ifstream使用filebuf进行缓冲,再按照标准执行:

C ++11§27.9.1.4[filebuf.members / 2]

  

basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);

     

效果:如果is_open()!= false,则返回空指针。否则,根据需要初始化filebuf。 ...

简而言之,双重打开会使您的流进入故障状态,这意味着与此相关的所有与数据相关的操作将从那时起彻底失败。

第二个错误:在循环条件表达式中不正确地使用.eof。一旦修复了第一个bug,你就会遇到这个问题。下面的问题解释了这个没有正确完成的原因,远比我在这里解释的要好得多。

Why is iostream::eof inside a loop condition considered wrong?

只需说,检查您的IO操作,而不仅仅是流的eof-state。养成这种习惯并坚持下去。

修复两者,你的代码可以简单地简化为:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream inputFile("testfile1.txt");
    std::string str;
    while (std::getline(inputFile, str))
        std::cout << str << std::endl;
}

显然,如果您正在拍摄更强大的代码,您可能希望在那里执行一些错误处理,例如:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>

int main()
{
    std::ifstream inputFile("testfile1.txt");
    if (!inputFile)
    {
        std::cerr << "Failed to open file\n";
        return EXIT_FAILURE;
    }

    std::string str;
    while (std::getline(inputFile, str))
        std::cout << str << std::endl;
}

答案 1 :(得分:0)

这是根据此article读取文件的正确方法! 您的代码中的问题似乎是您正在使用IDE并且它无法找到您为ifstream提供的路径,因此请尝试提供该文件的完整路径。希望它可以帮到你。

string line;
ifstream f("/YOUPARTH/testfile1.txt");
if (!f.is_open())
    perror("error while opening file");
while(getline(f, line)) {
   cout << line << endl;
}
if (f.bad())
    perror("error while reading file");
return 0;

答案 2 :(得分:-1)

翻译while语句:“当inputFile位于文件结尾时”..你想要否定它。