Visual Studio在尝试读取resource.txt文件时崩溃

Visual Studio crashes when attempting to read resource .txt file

本文关键字:txt 文件 崩溃 resource 读取 Studio Visual      更新时间:2023-10-16

我目前正在为我的类处理一个项目,遇到了一个非常令人困惑的错误。只要文件不存在,代码本身就会启动调试窗口。它只是打印错误消息,然后继续执行其余的代码。然而,当我试图将readInventory((函数(由我的教授提供(调用到main((中以读取f.open((中所述的inventory.txt文件时,我不断收到错误。.exe调试窗口可能会打开一秒钟,然后弹出带有绿色加载条的错误窗口,显示.exe已停止工作。我已经尝试了所有的方法,将inventory.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.txtn";
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;

}

这里有一些提示。您的代码需要更多的安全检查&小修复:

您的主要功能签名似乎是sus:

int main(int numberOfInvItems, inventoryItem inv[], ...... .....) { }

应该是

int main(int argc, char *argv[]) { }

注意:如果这不是您的ACTUAL APPLICATION MAIN函数,那么不要调用它MAIN。

其次,如果成功与否,您的代码readInventory方法应该真正返回bool,并且只通过参数返回正确的值:即:

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;
}

您是否已验证或强制Inventor[]和inv[]大小相同?如果一个尺寸比另一个大怎么办?它会崩溃的。要么迭代到其中最小的一个,要么根本不迭代。

您应该在每一行之后添加调试(std::couts或printf(,以查看它在哪里崩溃。调试调试调试。然后,您可以确定是哪一行/函数/表达式导致了问题。如果它崩溃了,并且根本没有打印调试,那么这可能是由于你的主函数不可靠。