在读取文件时,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();
}