Программирование на C чтение нескольких целых чисел в одной строке

#c #file #scanf #fopen #dev-c

#c #файл #scanf #fopen #dev-c

Вопрос:

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

 fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %d %d %d %d", a[i].letter , amp;a[i].hor, amp;a[i].width , amp;a[i].ver, amp;a[i].height)==5 amp;amp; i<LineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i  ;
}
  
  • A 10 213 20 20
  • B 100 10 150 15
  • ….

Однако после этого, когда я пытаюсь прочитать другой файл, который имеет следующий формат, с этим кодом:

 file1 = fopen("beg.txt", "r");
    printf("HELLOOOO");
    while(fscanf(file1, "%d %d %d %d", amp;b[i].id, amp;b[i].hor, amp;b[i].ver, amp;b[i].time)==4 amp;amp; i<LineCount){
    printf("HEYY");

        if(ferror(file1)  ||  feof(file1)) break;
    
        i  ;
    }
  

Формат :

  • 1 10 100 100
  • 2 100 10 100
  • 3 172 172 18
  • ….

fopen не возвращает NULL, поэтому он открывается, я вижу «HELLOOOO», но он никогда не доходит до «ПРИВЕТ», и программа завершается, не сразу, а за короткое время. Я дважды проверил все, файл и структура в правильном формате, я выполняю точно такую же операцию с первым, но она не работает.

Если у вас есть какие-либо идеи, что я делаю неправильно или какие могут быть возможные проблемы, я был бы признателен за ваши комментарии.

Комментарии:

1. Какое значение i перед чтением второго файла? Честно говоря, из того, что я прочитал, вы еще не все перепробовали. Например, ваш fscanf() сбой или нет? Пожалуйста, потратьте немного больше времени, это очень простая программа, которую вы должны иметь возможность отлаживать с помощью нескольких операторов печати или в отладчике.

2. Спасибо за ваш комментарий. i равно 0. Я действительно пробовал печатать на каждом шаге, и мне не удалось обнаружить источник проблемы. Я только что кое-что понял. Я могу прочитать второй файл, если я не читаю первый. Кроме того, если я объявлю еще одну переменную в main и присвою ей значение перед чтением. Я не могу даже прочитать один файл. Поэтому, если я объявляю больше переменных, чем текущие, я не могу прочитать файл или, если я читаю файл, я не могу прочитать другой. Я не настолько разбираюсь в C, поэтому у меня нет знаний об этом материале. Это проблема, связанная с памятью, или проблема с оборудованием?

3. Может i>=LineCount быть?

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

5. Хорошо, я перепостирую вопрос таким образом. Я думаю, что, поскольку я читаю файл в функции, и он работает, я объявляю любую переменную в main() перед этой функцией, и она перестает работать. Любая переменная, такая как int u = 0

Ответ №1:

Здесь я создал другую программу с нуля и выполнил все операции в main. Все та же проблема. Первый файл считывается, сохраняется в структуре и печатается без проблем. Однако для второго файла даже функция fopen() на этот раз не работает, она также не возвращает никакого значения, null или -1. Он просто ждет и завершает программу.

Структуры:

 struct data{
        char name[2];
        int a,b,c,d;
    };

struct fix{
    int x,y,z,u;
};
  

Чтение первого файла:

     char c;
    
    
    int lineCount = 1;
fp = fopen("data.txt", "r");
 for (c = getc(fp); c != EOF; c = getc(fp)){ //Get the number of lines
        if (c == 'n'){ 
            lineCount = LineCount   1; 
            }
             }      
    fclose(fp);     
    
int i=0;
struct data* a;
a = (struct data*)malloc(sizeof(a)*lineCount);  //Allocate memory for a      

fp = fopen("data.txt", "r");
if(fp==NULL) printf("Nulln");
while(fscanf(fp, "%s %d %d %d %d", a[i].name , amp;a[i].a, amp;a[i].b , amp;a[i].c, amp;a[i].d)==5 amp;amp; i<lineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i  ;

fclose(fp);
for(i=0;i<lineCount;i  ){

printf("%s, ", a[i].name);
printf("%d, ", a[i].a);
printf("%d, ", a[i].b);
printf("%d, ", a[i].c);
printf("%dn", a[i].d);
}
  

Чтение второго файла:

 lineCount = 1;

//files=fopen("beg.txt","r");
if(files=fopen("beg.txt","r")==NULL) printf("Hey"); //STUCK HERE!

if(files==NULL) printf("NULL2");
 for (c = getc(files); c != EOF; c = getc(files)){ //Get the number of lines
        if (c == 'n'){     //Get t
            lineCount = lineCount   1; 
            }
             }
        
struct fix* b = (struct fix*)malloc(sizeof(b)*lineCount);   //Allocate memory for b     

files = fopen("beg.txt", "r"); 
while(fscanf(files, "%d %d %d %d", amp;b[i].x, amp;b[i].y , amp;b[i].z, amp;b[i].u)==4 amp;amp; i<lineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i  ;
}
  

Комментарии:

1. Учитывая char c; , c != EOF не будет работать, потому EOF что это an int , а не a char . c != EOF либо не сможет определить конец файла, либо преждевременно обнаружит конец файла, когда char значение, считанное из файла, повышается до int и соответствует фактическим битам EOF целочисленного значения. getc() возвращает int и не char по этой причине.

2. Я понимаю. Но он работал правильно для первого файла, и это часто используемая практика, я не прав? Как вы думаете, это может вызвать проблему, с которой я сталкиваюсь? Как еще я мог подсчитать количество строк?