2015-02-25 2 views
0

Я использую dev C++. Я делаю эту простую функцию calles void quan(). Это включает в себя обработку файлов, чтение и добавление. Проблема в том, что когда я что-то ввожу, он падает. Я не знаю почему, и я думаю, что это из-за fscanf?чтение файла (fscanf) в C

void quan() 
{ 
    FILE *fp,*fp1; 
    int q; 
    char name[20]; 

    fp=fopen("inv.txt","r"); 
    fp1=fopen("temp.txt","a"); 

    if(fp==NULL) 
    { 
     printf("quan error"); 
    } 
    else 
    { 

     printf("enter product name: "); 
     gets(name); 

     while(fscanf(fp,"%s %d %f %s",s.prod,s.quant,s.price,s.day)==4) 
     { 
      if(strcmp(s.prod,name)!=0) 
      { 
       fprintf(fp1,"%s %d %.2f %s\n",s.prod,s.quant,s.price,s.day); 

      } 
      else 
      { 
       printf("enter quantity: "); 
       scanf("%d",&q); 
       s.quant=s.quant+q; 
       fprintf(fp1,"%s %d %.2f %s\n",s.prod,s.quant,s.price,s.day); 
       printf("\nsuccess"); 
      } 
     } 
    } 

    fclose(fp); 
    fclose(fp1); 

    remove("inv.txt"); 
    rename("temp.txt","inv.txt"); 
} 

это в моем inv.txt файл

apple 100 20.00 01/01/2015 
orange 100 10.00 01/01/2015 
banana 50 15.00 01/01/2015 
grapes 15 10.00 01/01/2015 
fan 100 5.00 01/01/2015 
+0

Вы проверяете, является ли 'fp' NULL, но нет, если' fp1' является NULL – Zaffy

+0

. Я думаю, что уже существует тысяча ответов на такие проблемы, разве вы ничего не нашли? – Ulterior

+0

Возможный дубликат [Самый простой способ прочитать эту строку текста в структуре?] (Http://stackoverflow.com/questions/3878327/easiest-way-to-read-this-line-of-text-into-a -struct) – Ulterior

ответ

0

Вы не заявили, что в fscanfs, поэтому указатель не будет работать, и ваши аварии приложение. Попробуйте использовать &s.prod, &s.prod, &s.quant, &s.price, &s.day

0

Поскольку вы открываете два файла, вы должны проверить, как на ошибку,

if(fp == NULL || fp1 == NULL) 

вы должны использовать соответствующие имена переменных в коде. Пример: вместо fp вы можете использовать inputFile, это даст соответствующее значение и сделает код более понятным для читателя.

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

Пример:

fscanf(fp, "%19s %d %f %10s", s.prod, &s.quant, &s.price, s.day) 

(Предполагая, что s.prod представляет собой массив размером 20 и s.day также массив размера 11) ,

Задание размера строки в формате fscanf позволит избежать превышения массива.

Кроме того, Вам не нужно указывать & для массива, так как массив уже пройдена как адрес, в то время как целое и поплавок переменная не является (и, таким образом, явно нуждается в его адрес передается с помощью & адреса оператора &).

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

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