开发者

C++: ifstream::getline problem

I am reading a file like this:

char string[256];

std::ifstream file( "file.txt" ); // open the level file.

if ( ! file ) // check if the file loaded fine.
{
    // error
}

while ( file.getline( string, 256, ' ' )  )
{
    // handle input
}

Just for testing purposes, my file is just one line, with a space at the end:

12345 

My code first reads the 12345 successfully. But then instead of the loop ending, it reads another string, which seems to be a return/newline.

I have saved my file both in gedit and in nano. And I have also outputted it with the Linux cat command, and there is no return on the end. So the file should be 开发者_C百科fine.

Why is my code reading a return/newline?

Thanks.


First leets make sure your input file is good:

Run the following command and let us know the output:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream file("file.txt");
    std::cout << std::hex;

    std::copy(std::istreambuf_iterator<char>(file),
              std::istreambuf_iterator<char>(),

              std::ostream_iterator<int>(std::cout, " ")); 
}

Edit:

The output was 31 32 33 34 35 20 0A

Try running this code and see what the output is:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ofstream file("file.txt");
    file << "12345 \n";
}

Dump the output of this file and compare it to the original.
The problem is that different platforms have different line termination sequences. I just want to verify that '0x0A' is the line termination sequence for your platform. Note the line termination sequence is converted into a '\n' when a file is read in text mode and when you output '\n' to a file in text mode it is converted to the line termination sequence.

Edit 2

So I have the file: file.txt

> od -ta -tx1 file.txt
0000000    1   2   3   4   5  sp  nl                                    
           31  32  33  34  35  20  0a                                    
0000007

So the file contains 1 line terminated with 0x0A

Using this program:

#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>

int main()
{
    std::ifstream   file("file.txt");

    std::string line;
    while(std::getline(file,line))
    {
        std::cout << "Line(" << line << ")\n";
    }
}

I get:

> g++ t.cpp
> ./a.out
Line(12345 )


it is working...

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

using namespace std;

ifstream file("file.txt");

int main()
{
   string tmp="",st="";

   while (!file.eof())
    {
      file>>tmp;  
      if (tmp != "") st+=tmp;
      tmp="";  
    }
   cout<<st<<endl; 

   return 0;
}

input file.txt : 1 2 3 4 5
answer : 12345


Try this way:

while ( !file.eof()  )
{
    file.getline( string, 256, ' ' );
        // handle input
}


It's old, but there does not seem to be proper resolution for this.

I'm surprised that no one has noticed that he's using space delimiter. Due to that the whole line won't be read, but only upto the first space. Thus getline will still have more data to read before encountering EOF.

So the next getline will read newline and return the same as the delimiter is . If the getline call were like this:

file.getline(string, 256)

it'll not return newline and will finish in one step.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜