2016-11-06 105 views
0
#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.任何人都可以检查代码中的错误从C++中的.txt文件读取时出错

+0

无关:您打开文件两次? – WhozCraig

+2

不,这是非常相关的。打开同一个文件两次是这里的错误。第二个'open()'失败,并在文件流上设置'fail'位。这里的第二个bug是流行的[while eof bug](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)。 –

+0

@SamVarshavchik显然代码已经变形了,因为几分钟前条件循环中的逻辑是它现在的反面。去搞清楚。 – WhozCraig

回答

-1

翻译while语句:“while inputFile is at End Of File”..你想要否定这一点。

+0

对不起,我实际上有(!inputfile。 eof),但它仍然没有做任何事情。在阅读文件时可能有问题吗? – user45524

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; 
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。一旦修复第一个错误,你会遇到这个问题。这个问题没有得到正确解决的原因在下面的问题中得到了很好的解释,我可以在这里解释它。

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

我只想说,检查你的IO操作,不只是流的EOF状态。进入这种习惯并坚持下去。

固定两种,你的代码可以从字面上减少到简单:

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