我目前正在为我的课程设计一个项目,并且遇到了一个非常令人困惑的错误。每当文件不存在时,代码本身将启动调试窗口。它只是打印错误消息,并继续执行其余的代码。但是,当我尝试将readInventory()函数(由我的教授提供)调用到main()中以读取f.open()中声明的stock.txt文件时,我总是收到错误消息。 .exe调试窗口可能会打开一秒钟,然后弹出带有绿色加载栏的错误窗口,表明.exe停止工作。我已经尝试了所有操作,将venture.txt移到了其他目录,但是什么也无法工作。任何见识将不胜感激!
我已经包含了解决问题所需的代码,但是如果需要更多项目,请告诉我。
readInventory()
void readInventory(inventoryItem inv[], int & numberOfInvItems, int & lastOrderNum) {
ifstream f;
// open the inventory file
f.open("inventory.txt");
if (f.fail()) {
cout << "readFile:: error opening inventory.txt\n";
numberOfInvItems = READ_ERROR;
return;
}
// read number of items from first line
f >> numberOfInvItems >> lastOrderNum;
// for each item, read the data for the item
for (int i = 0; i < numberOfInvItems; i++) {
f >> inv[i].prodCode >> inv[i].price;
f.ignore(); // finished reading integer, getline() on string is next
getline(f, inv[i].description);
}
f.close();
}
main()
int main(int numberOfInvItems, inventoryItem inv[], int lastOrderNum, char & option, bool orderItem2 , int lastOrderNumber, basket Order[], inventoryItem item[])
{
int b = -1;
const int MAX_INV_ITEMS = 10, MAX_BASKETS = 7;
bool orderNumber2 = false;
inventoryItem Inventory[MAX_INV_ITEMS];
basket Orders[MAX_BASKETS];
readInventory(inv, numberOfInvItems,lastOrderNum);
for (int m = 0; m < numberOfInvItems; m++) {
//Inventory[m].prodNum = m;
Inventory[m].prodCode = inv[m].prodCode;
Inventory[m].description = inv[m].description;
Inventory[m].price = inv[m].price;
}
lastOrderNumber = lastOrderNum;
while (option != 'X') {
getmainOption(option, item, numberOfInvItems, Inventory, orderItem2, b, MAX_BASKETS, lastOrderNumber, Order);
}
system("pause");
return 0;
}
答案 0 :(得分:0)
以下是一些提示。您的代码需要更多的安全检查和小的修复程序:
您的主要功能签名似乎是sus:
int main(int numberOfInvItems, inventoryItem inv[], ...... .....) { }
应该是
int main(int argc, char *argv[]) { }
注意:如果这不是您的ACTUAL APPLICATION MAIN函数,请不要将其称为main。
第二,如果成功,则代码readInventory方法应该真正返回布尔值,并且只能通过以下参数返回正确的值:即:
bool readInventory(inventoryItem inv[], int& numberOfInvItems, int& lastOrderNum)
{
// Could not open
if(f.fail())
return false; // Dont set NumberOfInvItems to READ_ERROR? WHAT DOES THAT EVEN MEAN?
// ...
// Successful
return true;
}
以及您的主要功能
int main(...)
{
int numberOfInvItems = 0;
int lastOrderNum = 0;
// Ensure it was successful via the return type
if(readInventory(inv, numberOfInvItems,lastOrderNum))
{
// ALL VALUES WEOULD BE VALID HERE
for(int i = 0; i < numberOfInvItems; ++i) {
// ...
}
}
}
第三,我的意见是避免使用C数组。我建议将它们交换到std :: vectors或至少交换到std :: array,以帮助减少可能的错误。
最后,在您的for循环中:
for (int m = 0; m < numberOfInvItems; m++) {
//Inventory[m].prodNum = m;
Inventory[m].prodCode = inv[m].prodCode;
Inventory[m].description = inv[m].description;
Inventory[m].price = inv[m].price;
}
您是否已验证Inventory []和inv []大小是否相同?如果一种尺寸大于另一种尺寸,该怎么办?它将崩溃。要么迭代到最小的一个,要么根本不迭代。
您应该在每行之后添加调试(std :: couts或printf),以查看具体崩溃的位置。调试调试调试。然后,您可以确定导致此问题的行/函数/表达式。如果它崩溃了,并且根本没有进行任何调试打印,则可能是由于您的主函数笨拙所致。