Visual Studio аварийно завершает работу при попытке прочитать файл .txt ресурса - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я работаю над проектом для своего класса и сталкиваюсь с очень запутанной ошибкой.Сам код запускает окно отладки всякий раз, когда файл отсутствует.Он просто печатает сообщение об ошибке и продолжает выполнение остального кода.Однако, когда я пытаюсь вызвать функцию readInventory () (которая была предоставлена ​​моим профессором) в main () для чтения файла inventory.txt, указанного в f.open (), я получаю сообщение об ошибке.Окно отладки .exe открывается, может быть, на секунду, а затем появляется окно с зеленой полосой загрузки, сообщающее, что .exe перестал работать.Я перепробовал все, переместил инвентаризацию.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;

}

1 Ответ

0 голосов
/ 26 октября 2018

На первый взгляд, вот несколько советов.Ваш код нуждается во многих других проверках безопасности и небольших исправлениях:

Кажется, что ваша основная функция подписана как 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 ::, чтобы уменьшить количество возможных ошибок.

Наконец, в вашем цикле 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's) после каждой строки, чтобы увидеть, где именно происходит сбой.Отладка Отладка Отладка.Затем вы можете определить, какая строка / функция / выражение вызвало проблему.Если происходит сбой, и отладка вообще не печатается, то, вероятно, это из-за вашей хитрой главной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...