Как прочитать текст из файла .txt, а затем сохранить его в записи (структура данных)? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть файл .txt с каждой строкой: StudentID, firstName, lastName и Score.Я хочу написать программу на C, которая читает файл .txt и сохраняет всю информацию КАЖДОГО студента в ЗАПИСИ (структура данных).Проблема в том, что я не знаю, какое условие я должен использовать для отдельного чтения каждого элемента (StudentID, firstName и т. Д.), Потому что они просто разделены пробелом '', а также есть проблема, которая у меня естьизменить строку для хранения информации о следующих учениках ... Любая помощь?

1 Ответ

0 голосов
/ 10 апреля 2019

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

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

 #include <stdio.h>  // fgets(), fopen(), fclose(), perror()
 #include <stdlib.h> // exit(), EXIT_FAILURE, strtof()
 #include <string.h> // strtok(), strcpy(), strtol()

относительно *; 1006 *

 StudentID , firstName, lastName and score.

, поэтому для каждого учащегося можно ввести 4 поля.

Как долго каждое из этих полей?

Используя разумное предположение о размерах:

 StudentID is unsigned long integer 
 FirstName is char array, max 30 characters
 LastName  is char array, max 30 characters
 Score     is float

Таким образом, структура для размещения одного студента будет:

 struct student
 {
    size_t   StudentID;
    char     FirstName[30];
    char     LastName[30];
    float    Score;
 };

Предполагая, что входной файл представляет собой строки текста, затем прочитать строку

 // open the file for reading
 if( !(fp = fopen( "studentFile.txt", "r" ) ) )
 {
     perror( "fopen for student input file failed" );
     exit( EXIT_FAILURE );
 }


 struct student *students = NULL;
 size_t studentCount = 0;

 char buffer[128];
 while( fgets( buffer, sizeof( buffer ), fp ) ) 
 { 

тогда каждая строка должна быть разбита на соответствующие поля и помещена в экземпляр структуры

     // increase number of students in array by 1
     struct student * temp = realloc( students, (studentCount+1) * sizeof( struct student ) );
     if( !temp )
     {
         perror( "realloc for new student data failed:" )
         free( students );
         exit( EXIT_FAILURE );
     }

     students = temp;

     char *token = strtok( buffer, " ");
     if( token )
     {
         students[ studentCount ]->StudentID = (size_t)strtol( token, 10 );

         if( (token = strtok( NULL, " " ) )
         {
             strncpy( students[ studentCount ]->FirstName, token. sizeof( student.FirstName) )l

             if( (token = strtok( NULL, " " ) )
             {
                 strncpy( students[ studentCount ]->LastName, token, sizeof( student.LastName );

                 if( (token = strtok( NULL, " " ) )
                 {
                     students[ studentCount ]->Score = strtof( token, NULL ); 
                 }
             }
         }
     }
     studentCount++;
 }

Тогда все строки информации об ученике во входном файле теперь являются экземплярами в массиве struct student

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

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