zy_sunshine 发表于 2009-12-31 00:01:05

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

最近用fstream比较多,发现如果用ifstream读取一个空文件的时候,开始的文件指针不是eof(),这样的话,就算是空文件也能读取出东西来,只不过是一群垃圾。

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

例如代码:struct NormalBookStruct{
        char title;
        char author;
        bool loanState;
};
char* normalDataFile = "normalBook.dat";
vector<NormalBookStruct> normalBookStruct;


{
        ifstream file(normalDataFile, ios::binary);

        NormalBookStruct bufStruct;
        while(!file.eof()){
                cout << "读取字符" << endl;
                //file.getline((char*)(&bufStruct), sizeof(NormalBookStruct));
                file.read((char*)(&bufStruct), sizeof(NormalBookStruct));
                normalBookStruct.push_back(bufStruct);
        }
        file.close();
}

jiangtao9999 发表于 2009-12-31 09:04:10

你最好检测文件长度,按照文件长度进行读取。

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

zy_sunshine 发表于 2009-12-31 16:52:35

回复 2# jiangtao9999 的帖子

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

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

jiangtao9999 发表于 2009-12-31 23:12:12

某些函数不按照实际文件大小,而是根据分配的数据块,每次读取都是读取 N 个块。
页: [1]
查看完整版本: C++ ifstream 读写文件 空文件的开始不是eof()?