我正在阅读这样的文件:
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
}
仅出于测试目的,我的文件只是一行,最后有一个空格:
12345
我的代码首先成功读取了12345。但是接着不是循环结束,它会读取另一个字符串,它似乎是一个返回/换行符。
我已将文件保存在gedit
和nano
中。我也用Linux cat
命令输出它,最后没有返回。所以文件应该没问题。
为什么我的代码会读取返回/换行符?
感谢。
答案 0 :(得分:3)
首先确保您的输入文件正常:
运行以下命令,让我们知道输出:
#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, " "));
}
输出为31 32 33 34 35 20 0A
尝试运行此代码并查看输出结果:
#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
#include <fstream>>
#include <iomanip>
#include <algorithm>
int main()
{
std::ofstream file("file.txt");
file << "12345 \n";
}
转储此文件的输出并将其与原始文件进行比较 问题是不同的平台具有不同的线路终端序列。我只想验证'0x0A'是您平台的线路终止序列。请注意,在文本模式下读取文件时,行终止序列将转换为'\ n',当您在文本模式下将'\ n'输出到文件时,它将转换为行终止序列。
所以我有文件:file.txt
> od -ta -tx1 file.txt
0000000 1 2 3 4 5 sp nl
31 32 33 34 35 20 0a
0000007
因此该文件包含以0x0A
使用此程序:
#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";
}
}
我明白了:
> g++ t.cpp
> ./a.out
Line(12345 )
答案 1 :(得分:2)
它正在运作......
#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;
}
输入file.txt:1 2 3 4 5
回答:12345
答案 2 :(得分:0)
尝试这种方式:
while ( !file.eof() )
{
file.getline( string, 256, ' ' );
// handle input
}
答案 3 :(得分:0)
它很旧,但是似乎没有合适的分辨率。
令我惊讶的是,没有人注意到他正在使用空格分隔符。因此,整行将不会被读取,而只会被读取到第一行。因此,在遇到EOF之前,getline仍然需要读取更多数据。
因此,下一条getline将读取换行符,并返回与定界符相同的结果。如果getline调用是这样的:
file.getline(string,256)
它不会返回换行符,将一步完成。