2016-03-28 3 views
0

У меня есть следующий код:Чтение файла в структуры иногда останавливается без причины

int main() {  
    FILE *fp = fopen("inventory.txt", "r"); 
    if (fp == NULL) { 
     printf("File Error"); 
     return 1; 
    } 

    while (1) { 
     char *componentType = malloc(200); 
     char *stockCode = malloc(20); 
     int numberOfItems = 0; 
     int price = 0; 
     char *additionalInformation = malloc(20); 

     int fileRead = fscanf(fp, "%[^,], %[^,], %i, %i, %[^,\r\n]", componentType, stockCode, &numberOfItems, &price, 
           additionalInformation); 

     if (fileRead == EOF) { 
      printf("End of file!\n"); 
      break; 
     } 

     printf("%s Read Record!\n", stockCode); 

     free(componentType); 
     free(stockCode); 
     free(additionalInformation); 
    } 

    printf("DONE!"); 
    fclose(fp); 

} 

файл выглядит следующим образом:

resistor, RES_1R0, 41, 1, 1R0 
resistor, RES_10R, 467, 1, 10R 
resistor, RES_100R, 334, 1, 100R 
resistor, RES_1K0, 500, 1, 1K0 
resistor, RES_10K, 169, 1, 10K 
resistor, RES_100K, 724, 1, 100K 
resistor, RES_1M0, 478, 1, 1M0 
diode, BY126, 118, 12 
diode, BY127, 45, 12 
transistor, AC125, 13, 35, PNP 
transistor, AC126, 40, 37, PNP 
.... 

Однако, когда я запускаю код иногда завершает как это:

RES_1R0 Read Record! 
RES_10R Read Record! 
... 
CF12 Read Record! 
CF13 Read Record! 
Done! 

Но иногда останавливается без причины, как это:

RES_1R0 Read Record! 
RES_10R Read Record! 
... 
D12 Read Record! 
D13 Read 

Каждый раз, когда она по-прежнему возвращает 0.

В чем проблема?

+2

Имеет ли ваша реальная память утечки кода, как показано на примере? Или это просто для иллюстративных целей? И сколько строк содержит ваш входной файл - чтобы определить, сколько памяти вы фактически выделяете. Для начала проверьте все возвращаемые значения 'malloc', чтобы проверить, не сработало ли какое-либо распределение. – kaylum

+0

Да, он протекает как пример выше. Однако я использовал «...», поскольку я не мог показать их всех, конечно. Есть 299 записей! –

+0

try '% [^, \ r \ n]' -> '% [^, \ r \ n]% * c' – BLUEPIXY

ответ

0

Поскольку этот вопрос теперь сильно изменился с тех пор, как я впервые спросил его (т.е. сначала я подумал, что это проблема памяти/структуры, тогда это стало проблемой компилятора, тогда я, наконец, понял, что это проблема IDE), поэтому Я решил создать новый вопрос в целом: Output for CLion IDE sometimes cuts off when executing a program.

Ответ на этот конкретный вопрос заключается в том, что это проблема с CLIE IDE. Чтобы исправить эту проблему, скомпилируйте и запустите код с помощью терминала, и вывод работает отлично.

Благодаря @Dominik Gebhar & @ Джонатан Леффлер за помощь !!!

-1

fscanf() возвращает количество считанных символов или ноль в конце файла, в то время как fgetc (FP) возвращает символ или EOF, если конец файла достигнут.

Вы смешиваете два метода обнаружения eof.

+2

"scanf() возвращает ноль в конце файла". В самом деле? На странице [fscanf man] (http://linux.die.net/man/3/fscanf): «Значение EOF возвращается, если достигнут конец ввода». – kaylum

+0

'fscanf()' возвращает количество успешно обработанных спецификаций преобразования, число которых может быть 0 или более; или он возвращает EOF, если он помещен в EOF (в файле больше нет данных), или если есть ошибка ввода-вывода. Он не возвращает количество прочитанных символов. Если строка формата имеет 6 спецификаций преобразования ('% s' или аналогичных) без подавления присваивания (не считая'% * s'), тогда найдите 6, которые будут возвращены; все меньше указывает на проблему. –

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