2015-04-15 3 views
0

Эта функция использует fgets для ввода данных из файла и сохранения их в структуре. Я получаю ошибку сегментации, и я не могу понять, почему. Программа не будет работать, поэтому я не смог отладить. Вот код для функции:ошибка сегментации с помощью fgets из входного файла в C

void getInventory(NodeT **ppRoot, char *pszInventoryFileName) 
{ 
    char szInputBuffer[100];  // input buffer for reading data 
    int iScanfCnt;     // returned by sscanf 
    FILE *pfileInventory;   // Stream Input for Inventory data. 
    Stock *pNew = NULL; 

    /* open the Inventory stream data file */ 
    if (pszInventoryFileName == NULL) 
      exitError(ERR_MISSING_SWITCH, "-i"); 

    pfileInventory = fopen(pszInventoryFileName, "r"); 
    if (pfileInventory == NULL) 
      exitError(ERR_INVENTORY_FILENAME, pszInventoryFileName); 

    /* get inventory data until EOF 
    ** fgets returns null when EOF is reached. 
    */ 
    while (fgets(szInputBuffer, 100, pfileInventory) != NULL) 
    { 
      iScanfCnt = sscanf(szInputBuffer, "%6s %ld %lf %30[^\n]\n" 
        , pNew->szStockNumber 
        , &pNew->lStockQty 
        , &pNew->dUnitPrice 
        , pNew->szStockName); 

      if (iScanfCnt < 4) 
        exitError(ERR_INVALID_INVENTORY_DATA, "\n"); 

      if (pNew == NULL) 
        exitError("Memory allocation error", ""); 

      printT(insertT(*ppRoot, *pNew)); 
    } 
} 

В printT и insertT функции являются рекурсивными, но программа не до того, как дойти до этого. И вот данные из входного файла:

PPF001 100 9.95 Popeil Pocket Fisherman 
SBB001 300 14.95 Snuggie Brown 
SBG002 400 14.95 Snuggie Green 
BOM001 20 29.95 Bass-O-Matic 
MCW001 70 12.45 Miracle Car Wax 
TTP001 75 9.95 Topsy Turvy Planter 
NHC001 300 9.95 Electric Nose Hair Clipper 
SSX001 150 29.95 Secret Seal 

Почему этот код дает мне ошибку сегментации?

+0

BTW 'nsertT (* ppRoot * pNew)': первый аргумент типа может 'NODET * * ' – BLUEPIXY

+0

« Код не запускается, поэтому я не могу отлаживать », но он * делает *, но вы не получите ошибку во время выполнения! Вы запутываете «бег» с «компиляцией» или что-то в этом роде? – usr2564301

ответ

4

Проблема в том, что, хотя вы проверяете pNew выделение на NULL, вы никогда на самом деле не выделяете памяти на него.

Добавьте вызов malloc относящий pNew и проверку памяти впереди sscanf вызова, чтобы устранить эту проблему:

while (fgets(szInputBuffer, 100, pfileInventory) != NULL) 
{ 
     pNew = malloc(sizeof(Stock)); 
     if (pNew == NULL) 
       exitError("Memory allocation error", ""); 

     iScanfCnt = sscanf(szInputBuffer, "%6s %ld %lf %30[^\n]\n" 
       , pNew->szStockNumber 
       , &pNew->lStockQty 
       , &pNew->dUnitPrice 
       , pNew->szStockName); 

     if (iScanfCnt < 4) 
       exitError(ERR_INVALID_INVENTORY_DATA, "\n"); 

     printT(insertT(*ppRoot, *pNew)); 
} 
+0

Это исправлено. Спасибо! – Kdiggity

Смежные вопросы