问题
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 fine.
Why is my code reading a return/newline?
Thanks.
回答1:
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 )
回答2:
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
回答3:
Try this way:
while ( !file.eof() )
{
file.getline( string, 256, ' ' );
// handle input
}
回答4:
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.
来源:https://stackoverflow.com/questions/4704097/c-ifstreamgetline-problem