Чтение данных из текстового файла в структурный массив - PullRequest
0 голосов
/ 28 сентября 2019

Что не так со следующим кодом?Как я могу это исправить?

Данные в строках разделены запятыми: имя, адрес, idnumber, возраст.

Что я хочу - это прочитать из текстового файла четыре поля выше, разделенныхзапятыми в одной строке и хранить эти данные в структуре массива, приведенной ниже, в коде как экземпляр struct person:

#include <stdio.h>

// struct person with 4 fields
    struct person
    {
        char name[100];
        char address[100];
        char IDnumber[20];
        int  age;
    };

int main()
{
   FILE *file = fopen ("personout.txt","r");
   // declares an struct array to store data
   struct person student[10];

   int k=0;

   if ( file != NULL )    
   {
       char line [ 128 ]; /* or other suitable maximum line size */
       while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
       {
           // Returns first token
           char* token = strtok(line,",");

          // Keep printing tokens while one of the
          // delimiters present in str[].
          while (token != NULL) {
              k=0;
           // countword++;
              printf("%s\n", token);

              switch (k) {
              case '1':
                  student[k].name==token;
              case '2':
                  student[k].address==token;
              case '3':
                  student[k].IDnumber==token;
              case'4':
                  student[k].age==token;
              default:
                  break;
              }

              k++;

              // put the values to array
              token = strtok(NULL, ",");
          }
      }
      printf("%s\n", student[k].name);
      fclose ( file );
  }

}

1 Ответ

0 голосов
/ 28 сентября 2019

Поскольку структура может содержать до 220 символов и целое число, используйте char line[300];
Только с четырьмя полями, набор сканирования в sscanf будет работать с хорошо отформатированным вводом.Scanset %[^,] будет сканировать символы, которые не являются запятыми.%99[^,], будет сканировать до 99 символов, которые не являются запятыми, а затем сканирует запятую." %99[^,], %99[^,], %19[^,], %d" будет сканировать два поля длиной до 99 символов, которые не являются запятыми, одно поле длиной до 19 символов, которые не являются запятыми, а затем целое число.sscanf вернет количество успешно отсканированных полей.Если отсканировано четыре поля, увеличьте k.

#include <stdio.h>

//struct person with 4 fields
struct person {
    char name[100];
    char address[100];
    char IDnumber[20];
    int  age;
};

int main ( void) {
    FILE *file = fopen ( "personout.txt", "r");
    // declares an struct array to store data
    struct person student[10];

    int k = 0;

    if ( file != NULL) {
        char line[300];
        while ( k < 10 && fgets ( line, sizeof line, file ) != NULL ) {
            if ( 4 == sscanf ( line, " %99[^,], %99[^,], %19[^,], %d"
            , student[k].name
            , student[k].address
            , student[k].IDnumber
            , &student[k].age)) {
                printf ( "%s\n", student[k].name);
                printf ( "%s\n", student[k].address);
                printf ( "%s\n", student[k].IDnumber);
                printf ( "%d\n", student[k].age);
                k++;
            }
        }
        fclose ( file );
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...