ifstream not reading EOF character

前端 未结 4 1775
不思量自难忘°
不思量自难忘° 2020-12-01 20:13

I am creating a program (In C++) that takes an ASCII file and reads a few values from each line until it reaches the end of the file. I am using ifstream to re

相关标签:
4条回答
  • 2020-12-01 20:53

    Your first call to getline is triggering one of the fail-bits on the ifstream object. That is why if you do a check for a fail-bit using ios::good(), you never enter your read loop. I would check to see what the value of line is ... it's probably empty, meaning you're having another issue reading your file, like maybe permissions problems, etc.

    0 讨论(0)
  • 2020-12-01 21:07

    The problem is here:

    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
    

    Try this:

    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]);
        }   
    }   
    
    0 讨论(0)
  • 2020-12-01 21:17

    Do not do it like that.

    EOF is not the only thing you'll encounter while reading. There's a bunch of errors you might get, and so the best is to simply test the stream itself:

    while(currentfile)
    {
        // read somehow
    }
    

    If you're reading lines, then, the simplest way is:

    std::string line;
    while(std::getline(currentfile, line))
    {
        // use line
    }
    
    0 讨论(0)
  • 2020-12-01 21:19

    First thing is first, you shouldn't check like that. eof() doesn't return true until after a failed read. But you can do better (and easier)!

    check the stream state with the implicit conversion to void* which can be used in a bool context. Since most of the read operations on streams return a reference to the stream, you can write some very consice code like this:

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

    Basically what it is doing is saying "while I could successfully extract a line from currentfile, do the following", which is what you really meant to say anyway ;-);

    Like I said, this applies to most stream operations, so you can do things like this:

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

    EDIT: The way I would rewrite your code is like this:

    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
    }
    
    0 讨论(0)
提交回复
热议问题