ifstream的不读EOF字符ifstream的不读EOF字符(ifstream not read

2019-05-12 04:11发布

我创建一个程序(在C ++中),其采用ASCII文件和,直到它到达文件的结尾从各行读取几个值。 我使用ifstream读取文件,我从未有过与它停止时,我使用的问题ifstream.eof()方法。 然而这一次,即使它找到EOF字符在我的测试情况下,当我分析我的其他文件,它是无限循环,因为它从来没有发现EOF字符。 这是一个编码的问题,或与我的文件的问题?

string line = "";
unsigned long pos = 0;
ifstream curfile(input.c_str());
getline(curfile, line);
int linenumber = 0;
cout<<"About to try to read the file"<<endl;
if (!curfile.good())
    cout<<"Bad file read"<<endl;
while (!curfile.eof())
{

    cout<<"Getting line "<<linenumber<<endl;
    linenumber++;
    pos = line.find_first_of(' ');
    line = line.substr(pos+1, line.size()-1);
    pos = line.find_first_of(' ');
    current.push_back(atof(line.substr(0, pos).c_str()));
    for (int i = 0; i<4; i++)
    {
        pos = line.find_first_of(' ');
        line = line.substr(pos+1, line.size()-1);
    }
    pos = line.find_first_of(' ');
    dx.push_back(atof(line.substr(0, pos).c_str()));
    pos = line.find_first_of(' ');
    line = line.substr(pos+1, line.size()-1);
    pos = line.find_first_of(' ');
    dy.push_back(atof(line.substr(0, pos).c_str()));
    getline(curfile, line);
}

编辑:当我第一次运行循环,currentfile.good()返回false ...我在做什么,导致它返回?

Answer 1:

第一件事,第一,你不应该检查这样的。 eof()不会返回true ,直到读失败 。 但是你可以做的更好(更容易)!

检查流状态下与隐式转换到void*它可以被用在bool上下文 。 由于大多数对流的读操作的返回流的引用,你可以写一些非常consice这样的代码:

std::string line;
while(std::getline(currentfile, line)) {
    // process line
}

基本上,它是做什么的说:“虽然我可以成功地提取线currentfile ,请执行下列操作”,这是你的真正用意是什么反正说;-);

就像我说的,这适用于大多数流操作,所以你可以做这样的事情:

int x;
std::string y;
if(std::cin >> x >> y) {
    // successfully read an integer and a string from cin!
}

编辑 :我会重写代码的方法是这样的:

string line;
unsigned long pos = 0;
int linenumber = 0;

ifstream curfile(input.c_str());

std::cout << "About to try to read the file" << std::endl;
while (std::getline(curfile, line)) {

    std::cout << "Getting line " << linenumber << std::endl;
    linenumber++;

    // do the rest of the work with line
}


Answer 2:

不要那样做。

EOF不是在阅读,你会遇到的唯一的事。 有错误一堆,你可能会得到,所以最好是简单地测试流本身:

while(currentfile)
{
    // read somehow
}

如果您正在阅读的线条,那么,最简​​单的方法是:

std::string line;
while(std::getline(currentfile, line))
{
    // use line
}


Answer 3:

你先调用getline被触发的故障位的一个ifstream对象。 这就是为什么如果你使用一个故障位检查ios::good()你永远不会进入你的读取循环。 我会检查,看看有什么价值line是......它可能是空的,这意味着你遇到另一个问题阅读您的文件,如可能的权限问题,等等。



Answer 4:

问题就在这里:

if (!curfile.good())
    cout<<"Bad file read"<<endl;   // OK you print bad.
while (!curfile.eof())             // But the loop is still entered.
                                   // Another reason to **NEVER** to use 
                                   // while (file.eof()) // as bad does not mean eof
                                                         // though eof is bad

试试这个:

void readFile(std::istream& str)
{   
    std::string     line;
    while(std::getline(str, line))
    {
        std::stringstream   lineStream(line);
        std::string         ignoreWord;
        int                 number[3];

        lineStream >> ignoreWord   // reads one space seporated word
                   >> number[0]    // reads a number
                   >> ignoreWord >> ignoreWord >> ignoreWords  // reads three words 
                   >> number[1]    // reads a number
                   >> number[2];   // reads a number

        current.push_back(number[0]);
        dx.push_back(number[1]);
        dy.push_back(number[2]);
    }   
}   


文章来源: ifstream not reading EOF character
标签: c++ ifstream eof