无限循环将文件读入数组

Infinite loop reading file into array

我在尝试读取文件时出现无限循环。从用户输入保存文件,然后读取,最后使用单独的函数显示。

这是我的阅读功能。循环没有找到 eof();从文件中。我看不出问题是什么。没有编译器错误。

void read(HouseholdItems items[AMOUNT], fstream& myFile, fstream& yourFile)
{
    myFile.open("insured.dat", ios::in | ios::binary);                                      // Open myFile
    yourFile.open("uninsured.dat", ios::in | ios::binary);                                  // Open yourFile
    for(int i = 0; i < AMOUNT; i++)
    {
        myFile.read(reinterpret_cast <char*>(&items[i]),sizeof(&items[i]));
        yourFile.read(reinterpret_cast <char*>(&items[i]),sizeof(&items[i]));
        for(i = 0; i < AMOUNT; i++)
        {
            while (myFile)
            {
                cout << "description: ";
                cout << items[i].description << endl;
                cout << "quantity: ";
                cout << items[i].quantity << endl;
                cout << "price: ";
                cout << items[i].price << endl;
                cout << "insured: ";
                cout << items[i].insured << endl;
            }
        }

    }

    myFile.close();
    yourFile.close();

}

您的问题是 while(myFile),因为在该循环中 myFile 没有任何变化。目前尚不清楚您要完成该循环的意思,所以我不能说用什么替换它。 (嵌套 for 循环似乎确实有问题,但似乎没有 table 数据。)

下面的循环永远不会结束:没有对循环体中的 myFile 进行任何修改:

        while (myFile)
        {
            cout << "description: ";
            cout << items[i].description << endl;
            cout << "quantity: ";
            cout << items[i].quantity << endl;
            cout << "price: ";
            cout << items[i].price << endl;
            cout << "insured: ";
            cout << items[i].insured << endl;
        }

您必须在 while 循环中读取文件才能结束。

此外,您很可能有变量名冲突:您有两个 for 循环使用相同的变量 i ;这可能不是你想要的。

@ScottHunter 和@Ekelog 的回答已经回答了真正的问题。以下是外围问题

这些行不对:

myFile.read(reinterpret_cast <char*>(&items[i]),sizeof(&items[i]));
yourFile.read(reinterpret_cast <char*>(&items[i]),sizeof(&items[i]));

您需要使用:

myFile.read(reinterpret_cast <char*>(&items[i]),sizeof(items[i]));
                                                    // ^^ Drop the &
yourFile.read(reinterpret_cast <char*>(&items[i]),sizeof(items[i]));
                                                    // ^^ Drop the &

期间试试这个

while (!myFile.eof()) { cout << "description: "; cout << items[i].description << endl; cout << "quantity: "; cout << items[i].quantity << endl; cout << "price: "; cout << items[i].price << endl; cout << "insured: "; cout << items[i].insured << endl; }

查看内联评论:

void read(HouseholdItems items[AMOUNT], fstream& myFile, fstream& yourFile)
{
    // since you open and close those files here, you probably
    // want to declare them here instead as a function parameter
    myFile.open("insured.dat", ios::in | ios::binary);                                      // Open myFile
    yourFile.open("uninsured.dat", ios::in | ios::binary);                                  // Open yourFile
    // test in the loop
    for(int i = 0; i < AMOUNT && myFile && yourFile; i++)
    {
        // these two reads do not make sense, the second one
        // will overwrite the data just read by the first one...
        // maybe you meant that one of the file might be smaller?
        // or maybe to compare the results in some ways (in which
        // case you need two arrays)
        myFile.read(reinterpret_cast <char*>(&items[i]),sizeof(items[i]));
        yourFile.read(reinterpret_cast <char*>(&items[i]),sizeof(items[i]));

        // write current result
        cout << "description: ";
        cout << items[i].description << endl;
        cout << "quantity: ";
        cout << items[i].quantity << endl;
        cout << "price: ";
        cout << items[i].price << endl;
        cout << "insured: ";
        cout << items[i].insured << endl;
    }

    myFile.close();
    yourFile.close();    
}

旁注:

  • 您的第二个 for() 循环重复使用了 i 变量,这意味着它根本无法按预期工作。
  • 正如其他人所指出的,sizeof() 是错误的,您也可以使用 sizeof(items[0]),因为所有项目的大小都相同。
  • 正如 SamIAm 所提到的,while() 正在阻塞,因为文件未被读取,因此 EOF 从未实际到达文件中。
  • 如评论中所示,文件对象可能应该在函数中而不是外部定义并作为引用传入。