Ошибка подтверждения отладки для программы на C - PullRequest
0 голосов
/ 02 марта 2012

Вот ссылка на изображение сообщения об ошибке:

http://www.flickr.com/photos/76298377@N02/6798897020/in/photostream

Вот актуальная проблема программирования.Это номер 3

http://books.google.com/books?id=bSy1hBCLNl8C&pg=PA335&lpg=PA335&dq=sales.dat+c%2B%2B&source=bl&ots=mmN9b4WzsN&sig=miAD8-u4ly8K1Mou9ZNHv90Nscc&hl=en&sa=X&ei=2wdQT_-4OtSCsgK-l5WyDg&ved=0CDcQ6AEwAg#v=onepage&q=sales.dat%20c%2B%2B&f=false

и вот исходный код

#include <iostream>
#include <string>
#include<stdio.h>

using namespace std;

#define numItems     8
#define numSalesP   10

// the product prices 
float prices  [numItems] = {345.0,  853.0, 471.0, 933.0, 721.0, 663.0, 507.0, 259.00};

// the product numbers
int   prodNum [numItems] = {7,      8,     9,     10,    11,    12,    13,    14};

// the salespersons IDs
int   salesP  [numSalesP] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// the output file pointers
FILE * filePtrs[numSalesP];

// sales totals for every salespersons
float totals  [numSalesP];

//get the product index from the prodNum array
int getProdIndex (int product) {
    int i;
    for (i=0; i< numItems; i++) {
        if (prodNum[i] == product) {
            return i;
        }
    }
    return -1;
}

// get a product price from the product index
float getProdPrice (int prodIndex) {
    return prices[prodIndex];
}

// open a salesperson output file
void openSalesPFiles () {
    int i;
    char fileName[16];;

    for (i=0; i<numSalesP; i++) {
        sprintf(fileName, "salespers%d.dat", i+1);
//DEBUG         cout << fileName << endl;
        filePtrs[i] = fopen(fileName, "r");
    }
}

// close Salespersons files
void closeSalesPFiles () {
    int i;
    for (i=0; i<numSalesP; i++) {
        fclose(filePtrs[i]);
    }
}

// get sales person index from its ID
int getSalesPIndex (int salesPerson) {
    int i;
    for (i=0; i< numSalesP; i++) {
        if (salesP[i] == salesPerson) {
            return i;
        }
    }
    return -1;
}



int main () {
    int i;                  // generic counter
    FILE * salesFile;       // the input file with all sales
    int salesPId;           // salesperson ID
    int salesPIndex;        // salesperson index in array
    int prodId;             // product ID
    int pIndex;             // product index in array
    int qty;                // quantity
    float total;            // total for one sale

    // open all salespersons output files
    openSalesPFiles();

    // open the input file
    salesFile = fopen("sales.dat", "r");

    // read all record in the input file
    while (!feof(salesFile)) {

        fscanf(salesFile, "%d %d %d", &salesPId, &prodId, &qty);
//DEBUG        cout << salesPId << " --- " << prodId << " --- " << qty << endl;

        // validate sales person
        salesPIndex = getSalesPIndex (salesPId);
        if (salesPIndex < 0) {
            cout << "Invalid Sales person ID " << salesPId << endl;
            continue;
        }

//DEBUG        cout << "Salesperson index : " << salesPIndex << endl;

        // validate product id
        pIndex = getProdIndex (prodId);
        if (pIndex < 0) {
            cout << "invalid product id : " << prodId << endl;
            fprintf(filePtrs[salesPIndex], "Invalid Product ID %d\n", prodId);
            continue;
        } 
        else {
            // compute the sale total
            total = qty * prices[pIndex];
//DEBUG            cout << "total : " << total << endl;;

            // add it to the totals for this salesperson
            totals[salesPIndex] += (qty * prices[pIndex]);

            // write the sale to the salesperson file
            fprintf(filePtrs[salesPIndex], "%d %d %2.2f\n", prodId, qty, total);
        }
    }

    // print totals in salespersons files
    for (i=0; i< numSalesP; i++) {
        fprintf(filePtrs[i], "Total Sales : %8.2f\n", totals[i]);
    }

    // close all files
    closeSalesPFiles();
    fclose(salesFile);


}

Что не так с кодом, который может вызвать такую ​​ошибку?Спасибо: S

1 Ответ

9 голосов
/ 02 марта 2012

Утверждение приходит из файла с именем feoferr.c . Это говорит о том, что это как-то связано с функцией feof. Утверждение говорит, что ожидалось stream != NULL. Утверждение не удалось, поэтому stream, очевидно, является нулевым указателем. Поскольку feof принимает параметр файлового потока, можно с уверенностью предположить, что поток, о котором упоминается в сообщении подтверждения, является параметром файлового потока. Вы звоните feof так:

// open the input file
salesFile = fopen("sales.dat", "r");

// read all record in the input file
while (!feof(salesFile)) {

Так что, возможно, salesFile - нулевой указатель. Как вы знаете, это может произойти, когда fopen не удается открыть файл. Возможно, файл не существует или у вас нет доступа к нему для чтения.


В следующий раз, когда вы столкнетесь с ошибкой, используйте инструменты, которые у вас есть перед вами. У вас есть отладчик, и он должен прервать вашу программу, когда она завершится таким образом. Это может привести вас к линии, которая потерпела неудачу, или к линии, ближайшей к ней. Это должно было дать вам подсказку, что проблема была где-то вскоре после того, как вы позвонили fopen. Начни там расследование.

Установите точки останова в коде позже, чем там, и посмотрите, доберетесь ли вы до них до сбоя вашей программы. Если вы не заходите так далеко, не включайте эти функции при публикации вопроса. Не пытайтесь найти потенциальных помощников с большим количеством ненужного кода, чтобы разобраться, просто чтобы разобраться с реальной проблемой.

Если у вас есть проблема, убедитесь, что ваши функции возвращают значения, которые вы ожидаете от них. Если вы не знаете, чего ожидать от них, прочитайте документацию и проведите несколько экспериментов. Убедитесь, что вы понимаете весь код, который вы написали.

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