将文本文件中的数据存储在结构数组中

Storing data from a text file in an array of structures C++

本文关键字:结构 数组 存储 文本 文件 数据      更新时间:2023-10-16

我正在尝试从文本文件读取数据到结构数组。for循环的第一次迭代读取并正确显示所有内容,直到它达到布尔值,之后的每次迭代都不按预期显示。末尾的bool值是否会导致错误地读取文件的其余部分?或者可能是由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

你需要告诉你的流bool值是带有

的文本
fin >> boolalpha >> inventoryDatabase[index].payByWeight

你在第一个bool输入后看到垃圾数据,因为failbit在流中被设置,并且在它被重置之前没有进一步的输入将工作。这将导致数组的数据保持未初始化。

以下是我认为可能导致你的问题的几件事。

1)数组不是"神奇地填充"数据。您有一个未初始化的数组,这意味着其中的数据还不存在。。

要解决这个问题,必须在每次循环迭代开始时向数组中添加一个新的实例

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

2)当你把getline<<放在一起使用时,我看到过奇怪的事情发生。你使用getline而不是<<有什么特别的原因吗?

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

3) 120programalarm所说的是绝对正确的。


旁注:不要因为"我想在那里任意地抛出一个大值"而养成抛出double的习惯。这是一个浪费空间的坏习惯,因为doublefloat的两倍大。

了解floatdouble之间的区别-除了科学场合,你几乎不会用到double,因为它适用于有很多小数点的数字。(这太简单化了。)如果您一直使用double而不是float,那么您将使用所需内存的两倍-实际上每个变量额外32位。加起来。(人们想知道为什么现代程序需要8GB的RAM来做与使用100mb RAM的前辈相同的事情…)

价格总是有两个(很少是三个)小数点后十位,所以float应该在所有情况下都完美地符合。