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吧。但这毕竟是两种开发语言。

参考资料:http://www.cplusplus.com/reference/iostream/ios/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<<" ";

C++怎么用eof判断txt文件到文件结尾了没
while (\/*你要读取的内容*\/!=EOF)比如while (scanf("%d",&n)!=EOF)EOF 计算机术语,缩写通常为EOF(End Of File),在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件...

请问C++怎么读到行结束和文件结束?
c++中有定义常量EOF作为文件尾 ifstream ifs("1.txt");char ch;while ((ch=ifs.get()) && ch!=EOF)...至于行结束,你可以使用输入流的成员函数getline或者非成员函数getline(前者针对char*,后者针对string),在函数中可以用'\\n'作为行结束符 ...

c++中文件的读入和输出是怎么样的?
一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,...

【C++学习笔记(四)】之EOF 与 feof的区别
feof是用于判断文件结尾的函数,存在于头文件中。使用方法为feof(fp),其中fp为指向需要判断的文件的指针。如果文件尚未到达结尾,返回0值;若已到结尾,则返回非0值。注意:在调用feof函数时,只有在指针读取到文件尾后才可能发生异常。使用feof的逻辑是先读取数据,之后再进行判断。EOF与feof的区别在于...

c++中编译中报错说“发现意外的文件尾”是什么意思
发现意外的文件尾,是C++编译中出现的一个错误,当C++编译程序对源文件进行编译时,会对一些特定的结束标志做配对或查找。当一个期望的符号没有找到,就已经达到文件尾部时,就会报这样的错误。对于这类错误,要重点查整个程序中大括号的配对情况,以及程序最后部分的结尾符号。比如如下程序:int main(){ ...

C C++语言 EOF
如果字节流的话,读取到了-1说明到了文件尾。int i=a.read();while(i!=-1){ \/\/继续读取 i=a.read();} 对于读取字符流的话,如果到了文件尾则返回null String i=a.readLine();while(i!=null){ \/\/继续读取 i=a.readLine();} ...

c++ 我用getline()读文件当到达最后时总是多读一行!!!急!!!
发生未读到错误后,infile.getline(s,1024,'\\n')为false,所以可以这样 while(infile.getline(s,1024,'\\n')){ ...} 即infile.getline(s,1024,'\\n')正确读到数据后再处理。也可 if(infile.getline(s,1024,'\\n')){ 处理...} 对 infile.get()infile.read()等都类似处理 ...

C++中怎样获取一个文件的大小,怎样判断一个文件是否为空(文件存在,但 ...
用C语言的风格:FILE *fp = fopen("","");fseek(SEEK_END);\/\/跳到文件尾 int lenth = ftell(fp);\/\/获得文件内部指针位置 lenth就是当前文件大小,如果lenth == -1,则文件为空

c++里读写文件函数i_file.good()使用问题,代码如下
while(i_file.good())和while (!i_file.eof())存在同样的问题,你到网上搜一下“C\/C++文件之eof()”,就明白怎么回事了。注意最后一段话:“2. 读取文件过程中,读取非char型时,使用peek判断文件尾将不再适用,循环判断条件应改用>>操作符进行读取,若读入char型缓冲区,peek函数会表现得很好...

怎样把数据输入到文件的末尾?C++代码!A+B问题中的
“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。其表示方法如表。起始点  表示符号  数字表示 ———文件首  SEEK—SET0 当前位置 SEEK—CUR1 文件末尾 SEEK—END   2 例如:fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。还要说明的...

相似回答