【问题标题】:Last data missing in an object array read from text file从文本文件读取的对象数组中缺少最后一个数据
【发布时间】:2014-08-10 05:09:19
【问题描述】:

这是一个家庭作业项目,用户在其中与具有数字、街道名称等数据的人员数据库进行交互,这些数据位于文本文件中。

某些菜单选项需要程序读取或操作该数据,例如显示选项。为此,我打开了一个 fstream 并将数据放入一个临时数组,该数组的数据类型为预先声明的 struct 常驻。

//reopen file
fstream listeResidents1;
listeResidents1.open("listeResidents.dat",ios::out|ios::in|ios::binary);

//Create a temporary array of objects resident for manipulation
resident tabRes1[nombreResid-1];

//Insertion des objets resident du registre dans le tableau temporaire
for (int h = 0;h < nombreResid;h++)
{
    listeResidents1.seekg((h)*sizeof(resident));
    listeResidents1.read(reinterpret_cast<char*>(&tabRes1[h]),sizeof(resident));
}

listeResidents1.close();

我的 Display() 函数执行此操作^^^,然后使用 for 循环遍历数组中的每个对象并显示它们的所有属性。然而,最后一个条目的倒数第二个字符串缺少一些字符,最后一个变量,一个浮点数,设置为 0(这意味着它也被截断),我不知道为什么。有谁知道为什么会这样?

对于一个视觉示例,最后一个条目已成功写入具有这些属性的文件:

int numero: 4
[the other,correctly displayed attributes here]
char rue[30]: queen
float superf: 80

显示最后一个条目时会显示

numero: 4
[the other,correctly displayed attributes here]
rue: que
superf: 0

如果我添加另一个条目,它会被截断,而现在 4 正确显示...

编辑:这是结构。

struct resident
    {
        int numero;
        char nom[30];
        char prenom[30];
        int numciv;
        char rue[30];
        float superf;
    };

【问题讨论】:

  • 您需要向我们展示类/结构常驻者的定义。
  • 也显示写的代码。

标签: c++ arrays struct text-files truncated


【解决方案1】:

您正在将nombreResid 项读入内存,但您的缓冲区resident tabRes1[nombreResid-1] 仅能容纳nombreResid-1 项。

【讨论】:

  • 在h
  • @blue0 对,但还有一个注意事项:在 C++ 中,数组从 0 开始索引。如果您的数组是 resident tabRes1[nombreResid-1],那么数组中的第一项是 tabRes1[0],最后一项是tabRes1[nombreResid-2]
  • 天哪,我忘了。因此,如果我声明一个数组 [10],它将具有条目 0-9。感觉自己好笨,改完再试试,非常感谢。我想知道为什么最后一个条目的其余数据仍然存在,但我想这与我仍然不理解的二进制代码的微妙之处有关。
  • 好吧,当您在tabRes1 的末尾写入内存后,其他一些操作可能会覆盖内存中的同一区域,可能是一堆零。 tabRes1 之后的区域可能不会被破坏,所以当你有时间阅读它时,它恰好处于相同的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多