C fscanf данные испортились - PullRequest
0 голосов
/ 18 октября 2018

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

Мой ввод выглядит примерно так:

Hayes,Darrell,Covey,Dasia,Hayes,Neftaly
Ashby,Angela,Chapman,Ebony,Ashby,Elliott

Мой код выглядит так:

while(1) {
int ret = fscanf(fp," %[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",
    g_human_array[g_human_count].last_name, 
    g_human_array[g_human_count].first_name, 
    g_human_array[g_human_count].mother_last, 
    g_human_array[g_human_count].mother_first, 
    g_human_array[g_human_count].father_last, 
    g_human_array[g_human_count].father_first
    );
printf("%s,%s,%s,%s,%s,%s,%d\n",
    g_human_array[g_human_count].last_name, 
    g_human_array[g_human_count].first_name, 
    g_human_array[g_human_count].mother_last, 
    g_human_array[g_human_count].mother_first, 
    g_human_array[g_human_count].father_last, 
    g_human_array[g_human_count].father_first,ret
    );
if(ret != 6) {
  fclose(fp);
  return READ_BAD_RECORD;
}

Тем не менее, мой вывод испорчен так:

Hayes,Darrell,Covey,Dasia,hby,Neftaly
Ashby,6
6
,,,,,,0
0

human_t и g_human_array определены так:

 typedef struct human_struct {
  char father_first[NAME_LENGTH];
  char father_last[NAME_LENGTH];
  char mother_first[NAME_LENGTH];
  char mother_last[NAME_LENGTH];
  char first_name[NAME_LENGTH];
  char last_name[NAME_LENGTH];

} human_t;

human_t g_human_array[MAX_HUMANS];

1 Ответ

0 голосов
/ 18 октября 2018

%[^,] будет соответствовать любой строке, не содержащей запятой.Это означает, что символ новой строки будет включен в строку, которой он соответствует, поэтому последний %[^,] будет соответствовать строке, содержащей последнее поле одной строки и первое поле следующей строки.Измените его на %[^,\n], чтобы оно не совпадало с новыми строками.

int ret = fscanf(fp," %[^,],%[^,],%[^,],%[^,],%[^,],%[^,\n]",
    g_human_array[g_human_count].last_name, 
    g_human_array[g_human_count].first_name, 
    g_human_array[g_human_count].mother_last, 
    g_human_array[g_human_count].mother_first, 
    g_human_array[g_human_count].father_last, 
    g_human_array[g_human_count].father_first
    );

Другое решение - использовать fgets() для чтения строки за раз, а затем sscanf() для ее обработки.Но вы все равно должны помнить, что fgets() оставляет новую строку в буфере, поэтому вы должны удалить ее перед обработкой с помощью sscanf() или поместить \n в набор исключений, как я это делал выше.

...