无限循环将文件读入数组
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 从未实际到达文件中。
- 如评论中所示,文件对象可能应该在函数中而不是外部定义并作为引用传入。
我在尝试读取文件时出现无限循环。从用户输入保存文件,然后读取,最后使用单独的函数显示。
这是我的阅读功能。循环没有找到 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 从未实际到达文件中。 - 如评论中所示,文件对象可能应该在函数中而不是外部定义并作为引用传入。