fstream的疑惑

来源:百度知道 编辑:UC知道 时间:2024/06/23 08:02:32
这段代码
int temp;
vector<int> Data;
fstream in("\home\zhaovv\temp.txt");
if(!in)
{
return;
}
while(!in.eof())
{
in>> temp;
Data.push_back(temp);
}

in.close();

temp.txt的数据是这样的
1 2 4 9 15 24 59 135
可是为什么每次都会读出两个135?Data里面保存了两个135是从哪里读来的?还是我这段代码本身有问题?

linux环境,g++编译程序

因为你的txt不严格,数据过后还有至少一个空格或者回车

假如代码是这样的:(我是在windows下的,一个道理)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> data;
ifstream in("1.txt");
if(!in)
return 1;
while(!in.eof())
{
int temp;
in>>temp;
data.push_back(temp);
}
in.close();
for(int i=0;i<data.size();i++)
cout <<data[i]<<' ';
}

如果文件是严格的数据,最后一个元素后没有任何多余字符,那么输出的结果肯定是1 2 4 9 15 24 59 135
如果有一个空格或者回车之类的字符,就会变成1 2 4 9 15 24 59 135 135

当有多余的回车(空格)时,in在读完最后一个数据135后,因为回车和空格都被作为>>插入符默认的界定符,在读取135后还有回车,所以文件当然没到头,!in.eof()成立,所以in>>temp开始读取下一个元素,但是因为跳过默认的界定符回车(空格)后,in得到的是文件尾标记,而非一个int值,所以in>>temp这个操作失败,temp并没有被写入新元素,但这个没有被修改的135仍然被压入向量中,所以有多余的一个135

如下修改证明,在最后一个元素后有多余的空格或回车的情况下,最后进行了一次无效读取
while(!in.eof())
{
int temp=-1; <