2015-11-25 3 views
0

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

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

int main(int argc, const char * argv[]) { 
    printf("Hello!\n"); 

    char filename[] = "artist.txt"; 

    print_artists(read_artists(filename)); 

    return 0; 
} 

    struct artist *read_artists(char *fname) 
    { 
     int maxlen = 225; 

     int artid = 0; 
     int altartid = 0; 
     int pc = 0; 
     char artname[80]; 

     char data[maxlen]; 
     int valid = 0; // 0 acts as true 1 acts as false 
     int checkresult = 0; //checks result of sscanf 

     struct artist *temphead = create_artist(0,0,0,"0"); 

     FILE *fp = fopen(fname ,"r"); 

     if (fp != NULL) 
     { 
      while (fgets(data,maxlen,fp)) 
      { 
       checkresult = sscanf(data,"%d\t%[^\t\n]\n",&artid,artname); 
       if (checkresult == 2) 
       { 
        struct artist *b = NULL; 
        b = create_artist(artid,altartid,pc,artname); 
        temphead = add_artist(temphead,b); 
       } 
       else 
       { 
        printf("error checkresult = %d\n",checkresult); 
        printf("break out of loop valid = 1\n"); 
        valid = 1; // acts as boolean variable 
        break; //breaks out of the while(fgets) 
       } 
      } 
      fclose(fp); 
      return (temphead); 
     } 
     else 
     { 
      fclose(fp); 
      printf("File Error\n"); 
      return (NULL); 
     } 

    } 

void print_artists(struct artist *head) 
{ 
    if (head != NULL) 
    { 
     struct artist *temp = head; 
     while (temp -> next != NULL) 
     { 
      print_artist(temp); 
      temp = temp -> next; 
     } 
     print_artist(temp); 
    } 
} 

Это выход

enter image description here

текстовый файл я читаю от

enter image description here

+1

Вы говорите, ошибки программы или что 'Е («error checkresult =% d \ n», checkresult); 'напечатан? – chux

+1

Примечание: лучше не называть' fclose (fp) 'когда' fp == NULL'. – chux

+1

ошибки программы abort6, и я попытался отбросить это, почему я 've addedprintf («error checkresult =% d \ n», checkresult); – ProtectorOfUbi

ответ

2

Когда вы достигнете пустую строку перед Bodenstandig, то sscanf не будет соответствовать и вы выйдете из цикла while в «break».

Если sscanf не возвращает 2, вы должны проверить, не ли ли пустая строка, и если так пропустить и прочитать следующую строку. Или просто пропустите проверку и проигнорируйте неправильные строки. В то время как (fgets (...) условие станет ложным в конце файла, так что вам не нужно, чтобы выйти на плохой линии.

if (checkresult == 2) 
{ 
    .... 
} 
else 
{ 
    continue; // will go back to top while(fgets(...)) 
} 
Смежные вопросы