文件操作EOF的问题
2012-01-09 22:10
176 查看
大家在使用C++写操作文件的程序时,一定使用过eof()这个函数,用它来判别文件结束,但有不少也用来判别文件是否为空的.但是,这样操作的结果不是我们所想的.看下面程序:
#include <string>
using namespace std;
int main()
{
char c = 'c';
ifstream FILE("test.txt");
if (FILE.eof())
cout << "文件是空的."<<endl;exit(1);
while (!FILE.eof())
{
FILE.get(c);
cout << c;
}
system("pause");
return 0;
}
当test.txt为空文件时,它输出的是:c
奇怪!应该输出是:文件是空的. while里面的操作也应该不用到的.但是结果偏偏和我们所想的相反.
好,那操作二进制文件又是怎样的呢?修改下为:
ifstream FILE("test.txt",ios::in|ios::binary);
if (FILE.eof())
cout << "文件是空的."< while (!FILE.eof())
{
FILE.read(&c,1);
cout << c;
}//代码其他部分相同
结果输出还是c..噢!!怎么会这样的.分明是骗人的东西嘛!!到底是什么原因呢?
经过一段研究后,原来eof()返回true的条件是"读到文件结束符",而不是文件内容的最后一个字符。
要清楚"文件结束符"(0xff).就是说我们文件最后的字符不是文件结束符,而最后的字符的下一位才是.所以操作再读多一次.就为什么上面if (FILE.eof())总是false的. 在一些编译器中(dev c++),它读到最后一个字符后文件位置的指针会定在那儿,所以就会重复最后一个字符.
在一个外国的CPP论坛见到一位同志的代码刚好有这解决方法.现在把上面的代码改为下面的:
#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
int main()
{
char c = 'c';
ifstream FILE("test.txt");
if (FILE.peek() == EOF)//修改
{
cout << "文件是空的."<< endl;
exit(1);
}
while (FILE.peek() != EOF)//修改
{
FILE.get(c);
cout << c;
}
system("pause");
return 0;
}
主要的是把eof()改为peek() == EOF来判别,其中peek()是取文件当前指针,EOF是文件尾标符,它的值为-1.所以采用这种方法就解决上面eof()的问题了..这种方法也可以用在读写二进制文件中.
#include <string>
using namespace std;
int main()
{
char c = 'c';
ifstream FILE("test.txt");
if (FILE.eof())
cout << "文件是空的."<<endl;exit(1);
while (!FILE.eof())
{
FILE.get(c);
cout << c;
}
system("pause");
return 0;
}
当test.txt为空文件时,它输出的是:c
奇怪!应该输出是:文件是空的. while里面的操作也应该不用到的.但是结果偏偏和我们所想的相反.
好,那操作二进制文件又是怎样的呢?修改下为:
ifstream FILE("test.txt",ios::in|ios::binary);
if (FILE.eof())
cout << "文件是空的."< while (!FILE.eof())
{
FILE.read(&c,1);
cout << c;
}//代码其他部分相同
结果输出还是c..噢!!怎么会这样的.分明是骗人的东西嘛!!到底是什么原因呢?
经过一段研究后,原来eof()返回true的条件是"读到文件结束符",而不是文件内容的最后一个字符。
要清楚"文件结束符"(0xff).就是说我们文件最后的字符不是文件结束符,而最后的字符的下一位才是.所以操作再读多一次.就为什么上面if (FILE.eof())总是false的. 在一些编译器中(dev c++),它读到最后一个字符后文件位置的指针会定在那儿,所以就会重复最后一个字符.
在一个外国的CPP论坛见到一位同志的代码刚好有这解决方法.现在把上面的代码改为下面的:
#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>
int main()
{
char c = 'c';
ifstream FILE("test.txt");
if (FILE.peek() == EOF)//修改
{
cout << "文件是空的."<< endl;
exit(1);
}
while (FILE.peek() != EOF)//修改
{
FILE.get(c);
cout << c;
}
system("pause");
return 0;
}
主要的是把eof()改为peek() == EOF来判别,其中peek()是取文件当前指针,EOF是文件尾标符,它的值为-1.所以采用这种方法就解决上面eof()的问题了..这种方法也可以用在读写二进制文件中.
相关文章推荐
- C++中文件操作EOF的问题
- C++中文件操作EOF的问题
- 文件操作eof()的问题
- 文件操作EOF()的问题
- 关于不同用户操作同一个文件的问题
- javascript操作写入txt文件及消息: Automation 服务器不能创建对象问题
- ‘操作无法完成 ,因为其中的文件夹或文件已在另一程序中打开’问题解决
- 网络编程中的socket中关于TCP下的文件传输:EOF问题
- JAVA基础 day23 IO流的其他类 (对象的序列化 管道流 RandomAccessFile类(随机读取文件) DateStream(操作基本数据类型的流) 操作数组的流 )字符编码问题
- 服务器搭建,远程操作,文件上传,问题汇总
- VB文件操作问题
- C语言文件读写操作中缓冲区问题和setbuf函数详解
- 文件读取操作的问题
- Java 编程技术中汉字问题的分析及解决,文件操作
- android中对sd卡的 操作文件问题 创建目录 创建文件到指定目录
- 安装SQL Server 2000时出现以下错误提示:“以前的某个程序安装已在安装计算机创建挂起的文件操作,运行安装程序之前必须重新启动计算机” 说明:如果重启计算机无法解决问题,可能有以下两个原因
- diy数据库(五)--文件操作、问题诊断和配置文件
- 你必须知道的261个Java语言问题笔记- Java流和文件操作1
- Moss文件操作速度慢的问题解决记录
- oracle 数据库imp操作导入dmp文件时表空间问题