尝试从文件中读取对象,并在正确获取一些记录后,我的程序检测到 eof,留下了许多记录

trying to read objects from a file and after getting some records CORRECTLY my program detects eof,many records are left

提问人:Pankaj Sadhwani 提问时间:8/27/2020 最后编辑:tadmanPankaj Sadhwani 更新时间:8/27/2020 访问量:41

问:

我正在尝试将文件中的记录读取到对象中。但是在正确读取某些记录后,程序会检测到文件末尾,即使文件中还有更多记录。我已经使用同一类的对象在文件上写入了记录,但我不明白出了什么问题。

这是我的代码-

    int main()
         {
            long int n=0;
            class_name objt[100];
            ifstream fl;
            fl.open(filename);
            cout<<"Scanning file"<<endl<<"Please Wait"<<endl;
            while(true)
              {
                  fl.read((char*)&objt[n], sizeof(objt[n]));
    
                  if(fl.eof())
                   {
                      cout<<endl<<"END OF FILE"<<endl<<"Press any key to continue";
                      cin.get();
                      break;
                   }
                  n++;
             }
             fl.close();
             cout<<endl<<"Scanning Complete!"

这是我正在使用的类-

class class_name
         {
           public:
           char name[20];
           double cn ;
           int code;
           int unit;
        };

P.S. 我想将所有记录保存到对象数组中,以便对数组进行排序

C++ 文件处理 ifstream eof

评论

0赞 WhozCraig 8/27/2020
如果您认为编写您现在正在阅读的文件的代码不相关,请再想一想。
0赞 tadman 8/27/2020
提示:一次使用一条记录。不要假设 100 会这样做,因为它可能不会。std::vector<class_name>push_back
0赞 tadman 8/27/2020
提示:不要读取原始二进制结构,而是使用 和 定义序列化和反序列化方法,以便可以直接对流进行操作。无需低级别调用。operator<<operator>>read
1赞 molbdnilo 8/27/2020
您不应该以文本模式打开二进制数据 - 它可以做非常奇怪的事情,尤其是在 Windows 上。
0赞 Pankaj Sadhwani 8/28/2020
我尝试读取的文件是一个 .txt 文件,我通过使用 rand() 生成随机数来填充此文件中的记录。

答:

0赞 john 8/27/2020 #1

如果您要执行二进制 I/O,则必须在二进制模式下打开文件(用于读取和写入)

        ifstream fl;
        fl.open(filename, ios_base::binary);