C++文件读取判断文件尾

#include "fstream"
#include "string"
using namespace std;
int MAX_LENGTH = 3;
const int INCRESEMENT = 2;
int COUNT = 0; //Count the amount of the data
struct ReadData
{
int data;
ReadData *next;
};

void ArraySort(int a[], int number); //Sort function
void InsertNumber() ; //Insert function
void main()
{
int *Array = new int[MAX_LENGTH];
int ntestnumber = 0;
cout << "Please input your number,input -1 to exit"<<endl;
cin >> ntestnumber;
while (ntestnumber != -1 )
{
Array[COUNT] = ntestnumber; COUNT++;
if (COUNT == MAX_LENGTH)
{
MAX_LENGTH += INCRESEMENT;
int *p = new int[MAX_LENGTH];
for (int i = 0; i < COUNT; i++)
{
p[i] = Array[i];
}
delete []Array;
Array = p;
}
cin>>ntestnumber;
}

ArraySort(Array, COUNT); //order the data
ofstream out_file;
out_file.open("a.txt", ios::out);
if (!out_file)
{
cerr<<"Open failure,exit the task"<<endl;
exit(-1);
}
for (int i = 0; i < COUNT; i++)
{
out_file<<Array[i]<<" ";
}
out_file.close();
delete []Array;
InsertNumber();

}
//Order data from small to big
void ArraySort(int *pointer, int number)
{
for (int i = 1; i <= number-1; i++) {
for (int j = 0; j < number-i; j++) {
if (pointer[j] > pointer[j+1])
{
int temp = pointer[j];
pointer[j] = pointer[j+1];
pointer[j+1] = temp;
}
}
}
}

void InsertNumber()
{
ifstream in_file;
in_file.open("a.txt", ios::in);
if (!in_file)
{
cerr<<"Open error,exit the task"<<endl;
exit(-1);
}
ReadData head; //create a node before the head node
head.data = 0;
head.next = NULL;
ReadData *p = NULL;
ReadData *q = &head;
int n_data;
while (!in_file.eof()) {
in_file >> n_data;
p = new ReadData;
p->data = n_data;
p->next =NULL;
q->next = p;
q = p;
head.data++;
}
p = &head;
while (p->next)
{
p = p->next;
cout << p->data<<endl;
}

in_file.close();

当输入1 3 4 2 四个数十时,输出InsertNumber()函数会将最后一个数据读两遍,为什么啊,我使用了while(in_file>>n_data){},这方法能行,但是想请问高手那个为什么不行啊

C++读取文件时,一般是将文件信息,如TXT文件,分成一维数组流读入,判定文件是否读完只需要判定数组的下一项是否有文件即可。具体代码为:While(in_>>file!=EOF),其中in>>file指的是读入的数据流,EOF为终止表示符。

C++常用文件操作:
1、打开文件的方法
调用构造函数时指定文件名和打开模式
ifstream f("d:\\12.txt",ios::nocreate); //默认以 ios::in 的方式打开文件,文件不存在时操作失败
ofstream f("d:\\12.txt");  //默认以 ios::out的方式打开文件
fstream f("d:\\12.dat",ios::in|ios::out|ios::binary); //以读写方式打开二进制文件
使用Open成员函数
fstream f;
f.open("d:\\12.txt",ios::out); //利用同一对象对多个文件进行操作时要用到open函数
检查是否成功打开
成功:
if(f){...} //对ifstream、ofstream对象可用,fstream对象不可用。
if(f.good()){...}
失败:
if(!f){...}  // !运算符已经重载
if(f.fail()){...}
2、读写操作
使用<<,>>运算符
只能进行文本文件的读写操作,用于二进制文件可能会产生错误。
使用函数成员 get、put、read、write等:
ofstream的成员函数write从内存中的一个指定的位置开始输出固定数目的字节到指定的流,当流被关联文件时,函数write在文件中从put文件定位指针指定的位置开始写入数据
ifstream的成员函数read将固定数目的字节从一个指定的流输入到内存中指定地址开始的一部分空间中,若关联文件,read函数在文件中从get文件定位指针指定的位置开始读取数据
经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。
读写二进制文件注意事项
打开方式中必须指定ios::binary,否则读写会出错
用read\write进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。
使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数
3、关闭文件

使用成员函数close,如:
f.close();
利用析构函数
对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-23
我不同意 米兰箭客 的说法。

这并不是C++的bug,C++本来就是这么设计的。
看eof的帮助是这样说的:
bool eof ( ) const;
Check if eofbit is set

The function returns true if the eofbit stream's error flag has been set by a previous i/o operation. This flag is set by all standard input operations when the End Of File is reached in the sequence associated with the stream.

显然,eof应该在i/o操作之后执行,用来判断本次i/o是否成功。
所以你把eof放在read之前肯定是不对的。

P.S. 也许写惯了C#或java程序的人不习惯C++的eof吧。但这毕竟是两种开发语言。

参考资料:

本回答被提问者采纳
第2个回答  2010-07-22
这是EOF的Bug,在C语言中,只有输入例程试图读取并失败以后才能得到EOF.
具体的讲,in_file >> n_data在读文件最后一行的,该文件的剩余长度不为0,所以不置文件结束标志。而再in_file>>n_data时,文件的剩余长度为0,读不出数据,指针仍指向原处,所以才会又输出一次,然后才能得到EOF.
不要使用这种方式,直接使用While(in_>>file>>n_date)就好了。
第3个回答  2015-11-06
程序自动判断的,只要在while里读取就可以了是在括号内。
while (fin.peek() != EOF)
{
infFile >> a;
}
EOF为文件结束标志符
第4个回答  2010-07-25
无语了.这本来是LZ自己写程序出了小毛病,结果牵连也太大了吧
好了.LZ自己下次写程序注意这些小细节吧

out_file<<Array[i]<<" ";
注意这儿..你每次都添加了一个空格做分隔符,但是最后一次就不应该添加了,不然怎么判断得出到了文件尾呢.结果使得当读取到文件最后一个数字时,都还没有到达文件尾(文件里面还有一个空格没有读取,你可以用记事本打开文件然后全选你就能看见了),你应该在这儿做去判断.
可以这样写
out_file<<Array[i];
if(i<COUNT-1)
out_file<<" ";

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网