#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。任何人都可以检查代码中的错误
答案 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位于文件结尾时”..你想要否定它。