QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3761|回复: 3

C++ ifstream 读写文件 空文件的开始不是eof()?

[复制链接]
发表于 2009-12-31 00:01:05 | 显示全部楼层 |阅读模式
最近用fstream比较多,发现如果用ifstream读取一个空文件的时候,开始的文件指针不是eof(),这样的话,就算是空文件也能读取出东西来,只不过是一群垃圾。

大家有碰见过这种情况的吗?一般是发生在数据还没初始化的时候。
怎样避免呢?

例如代码:
  1. struct NormalBookStruct{
  2.         char title[20];
  3.         char author[20];
  4.         bool loanState;
  5. };
  6. char* normalDataFile = "normalBook.dat";
  7. vector<NormalBookStruct> normalBookStruct;


  8. {
  9.         ifstream file(normalDataFile, ios::binary);

  10.         NormalBookStruct bufStruct;
  11.         while(!file.eof()){
  12.                 cout << "读取字符" << endl;
  13.                 //file.getline((char*)(&bufStruct), sizeof(NormalBookStruct));
  14.                 file.read((char*)(&bufStruct), sizeof(NormalBookStruct));
  15.                 normalBookStruct.push_back(bufStruct);
  16.         }
  17.         file.close();
  18. }
复制代码
发表于 2009-12-31 09:04:10 | 显示全部楼层
你最好检测文件长度,按照文件长度进行读取。

印象里某些读取文件的函数,如果超额读取,会读取到其他数据,直到文件分配的空间被读取完毕而不是实际文件内容被读取完毕。超额部分的垃圾,是以前这个位置存储数据的遗留内容。
回复

使用道具 举报

 楼主| 发表于 2009-12-31 16:52:35 | 显示全部楼层

回复 2# jiangtao9999 的帖子

......是的,必须要检测文件长度。
string s;
s << file;
if(s.length == 0)
return;

这些东西真麻烦。明明是eof()他怎么还读
回复

使用道具 举报

发表于 2009-12-31 23:12:12 | 显示全部楼层
某些函数不按照实际文件大小,而是根据分配的数据块,每次读取都是读取 N 个块。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-27 05:25 , Processed in 0.067055 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表