【问题标题】:Storing data from a text file in an array of structures C++将文本文件中的数据存储在结构数组中 C++
【发布时间】:2015-10-13 00:23:08
【问题描述】:

我正在尝试将文本文件中的数据读取到结构数组中。 for 循环的第一次迭代会正确读取并显示所有内容,直到达到布尔值,之后的每次迭代都不会按预期显示。最后的布尔值是否会导致文件的整个其余部分被错误地读取?或者可能是由 getline 引起的问题?

int main()
{
    groceryProduct inventoryDatabase[25];
    ifstream fin("inventory.txt");
    if (!fin)
    {
        cout << "File could not be located.";
    }
    string itemName;

    for (int index = 0; index < 25; index++)
    {
        getline(fin, inventoryDatabase[index].itemName, '\n');
        fin >> inventoryDatabase[index].itemNumber;
        fin >> inventoryDatabase[index].itemPrice;
        fin >> inventoryDatabase[index].membershipPrice;
        fin >> inventoryDatabase[index].payByWeight;

        cout << inventoryDatabase[index].itemName << endl;
        cout << inventoryDatabase[index].itemNumber << endl;
        cout << inventoryDatabase[index].itemPrice << endl;
        cout << inventoryDatabase[index].membershipPrice << endl;
        cout << inventoryDatabase[index].payByWeight << endl;
    }
    return 0;
};

结构:

struct groceryProduct
{
    double itemPrice;
    double membershipPrice;
    double itemWeight;
    int itemQuantity;
    string itemNumber;
    string itemName;
    bool payByWeight;
};

输出:

Apple
P0000
0.85
0.8
204 (expected output of 'false' instead of 204)

第一次迭代后循环每次迭代的输出:

-9.25596e+61
-9.25596e+61
204

谢谢,如果您需要更多信息,请告诉我。

文件:

Apple
P0000
.85
.80
false
Orange
P0001
.95
.85
false
Lemon
P0002
.65
.60
false

【问题讨论】:

  • 我们能看到您从中提取的文件吗? (此外,如果这是家庭作业,您可能应该检查您的书和/或与您的教授交谈。我们只会为您指出正确的方向,但这里更有经验的程序员不会给您代码,以免干扰你的学习。)
  • 欢迎来到 StackOverflow!在此处包含Minimum Working Example 肯定会帮助您解决问题。至少,由于涉及到inventoryDatabase,因此很高兴知道您如何定义和初始化它。
  • 感谢您的回复,并相应地进行了一些修改。这是针对学校作业的,但是除了程序必须具有的功能之外,没有给出任何实际要求。我从导师那里得到的唯一回应是,“我不确定,我会做一些阅读,看看我能找到什么。”尽管我一定会在明天问他。
  • 好吧,至少你和他谈过了。这就是我们所要求的。 :) 你会惊讶于有多少学生来到这里并要求我们为他们做作业。

标签: c++ arrays structure fstream


【解决方案1】:

你需要告诉你的流布尔值是文本

fin >> boolalpha >> inventoryDatabase[index].payByWeight

您在第一次 bool 输入后看到垃圾数据,因为在流中设置了失败位,并且在重置之前没有其他输入将起作用。这会导致您的数组数据保持未初始化状态。

【讨论】:

  • 啊,是的,这样就可以了。我知道我在回答中忘记了一些东西...+1!
【解决方案2】:

我发现有几件事可能会导致您的问题。

1) 数组不会“神奇地填充”数据。您有一个未初始化的数组,这意味着其中的数据尚不存在。完全没有。

您必须做的就是在每次循环迭代开始时将结构的新实例添加到数组中。

我是怎么发现的?好的经验法则:如果它很奇怪,那就是与记忆有关。确保您已初始化所有内容。

2) 我看到当您将getline&lt;&lt; 并排使用时会发生奇怪的事情。您使用getline 而不是&lt;&lt; 有什么特别的原因吗?

(我需要重新研究如何解决这个奇怪的问题。我以前在我的 C++ 课上经常碰到它。)

3) 1201ProgramAlarm 所说的完全正确。


旁注:不要养成到处乱扔double 的习惯,因为“我希望能够在其中任意扔大值”。这是一个浪费空间的坏习惯,因为doublefloat 的两倍。

了解floatdouble 之间的区别 - 在科学环境之外,您几乎不需要double,因为它适用于具有大量小数位的数字。 (这过于简单化了。)如果您一直在使用double 而不是float,那么您使用的内存是您需要的两倍 - 事实上,每个变量额外增加 32 位。它加起来。 (人们想知道为什么现代程序需要 8GB 的​​ RAM 才能与使用 100MB RAM 的前辈做同样的事情......)

价格总是有两位(很少三位)小数,所以float 应该在所有情况下都完美匹配。与权重相同。

【讨论】:

  • 注意关于双精度与浮点的这一点。我使用 getline 是因为某些项目名称包含空格。我添加了 1201ProgramAlarm 推荐的更改,并初始化了结构定义中的所有内容。我得到了 bool 值的预期“0”,并且程序在无法继续更改结构中的值之前使其更进一步。 bool值初始化为false,所有字符串初始化为“”,所有数字初始化为0。 Apple P0000 0.85 0.8 0 Orange 0 0 0 0 0 0 0 0 0
  • 嗯...用该信息创建一个新问题,并在此处链接我。我去看看。
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 2012-11-29
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2015-03-03
相关资源
最近更新 更多