C++文件流public function—eof()

来源:互联网 发布:unity3d源代码 编辑:程序博客网 时间:2024/06/03 17:54

在读取文件时,C++读取文件操作在判断文件结尾时都需用到eof()函数,但在使用该函数时经常会碰到结尾多读一个字符的情况,即末位字符重复出现一次。

出现这种情况的原因:

文件的结尾都有一个不可见尾字符——oxff,该字符标志文件的结束;C++文件流中eof()函数在读到文件末尾时,并不会立刻返回true,而是停顿一下,再读一次,于是就出现了末位字符重复出现的情况。

解决方法:

此时C++文件流中的good()函数就能发挥作用了,在对文件读入的字符操作前,使用文件对象调用good()函数进行判断,例如:

if(readFile.good()){//在此处写入对读入字符的操作,例如:cout<<ch;}
或者调用函数peek(),peek()函数并不会真正读取下一个字符,即文件指针并不会向后移动一位,只是查看缓冲区中的下一个元素。例如:

if(readFile.peek()!=EOF){   readFile>>ch;   cout<<ch<<ends;}
以上两种方法都不能解决此类问题;下面讲述一个C++文件读取的例子,主要用于学习文件流中的函数的使用。

1.打开文件

在C语言中,打开文件调用函数fopen,加上if条件句构成若打开错误则对出错情况进行处理的代码,在C++中可以这么写:

ifstream readFile;readFile.open(fileName);//打开文件不成功,终止if (readFile.fail()){exit(1);}//打开文件成功if (readFile.is_open()){                       //打开成功,在此处写对文件内容操作的代码}
C++文件流中fail()函数可用于判断是否成功关联文件和文件对象,他的意思是若打开失败则....(执行相关代码,最后调用exit(1);返回给系统结束程序运行)。

is_open()函数也有同样的功能,它的意思是若成功打开文件,则...(执行相关代码,此时不用调用exit(1))。

2.读文件,判断结尾

while (!readFile.eof()){//此处写代码}
3.判断是否到结尾,防止重复读取末位字符

if (readFile.good()){//若未到结尾,则继续操作}
4。关闭文件对象

readFile.close();

最后给出一个例子

//构建串void StrAssign(string fileName){S = (Node *)malloc(sizeof(Node));ifstream readFile;readFile.open(fileName);//打开文件不成功,终止if (readFile.fail()){exit(1);}//打开文件成功,构建串if (readFile.is_open()){char ch;Node *r, *p;//尾插法r = S;//不断链接数据节点while (!readFile.eof()){readFile >> ch;if (readFile.good()){p = (Node *)malloc(sizeof(Node));p->data = ch;r->next = p;r = p;}}//处理尾节点指针域r->next = NULL;}//未成功打开文件,生成空串else{S->next = NULL;}readFile.close();}










0 0
原创粉丝点击