как данные могут быть прочитаны из текстового файла и сохранены как структура? - PullRequest
0 голосов
/ 15 марта 2019

Давайте назовем этот файл f1.txt, и он имеет атрибуты.

  • Код студента
  • имя
  • ID

и резидентная структура из другого файла, назовем f2.txt, будет читаться со следующими атрибутами

  • ID
  • Город

, и место жительства будет запрашиваться уклавиатура.

Я пытался, но в какой-то момент застрял

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
    int student_code;
    char name[20];
    char ID[20];
};

int main()
{
    FILE *input_file;
    struct student input;

    input_file = fopen("f1.txt", "r");
    if(input_file == NULL)
    {
        fprintf(stderr, "\nError!\n");
        exit(1);
    }

    while(fread(&input, sizeof(struct student), 1, input_file))
        printf("student code = %d name = %s ID = %s", input.student_code, 
input.name, input.ID);
    fclose(input_file);

return 0;

}

Я новичок в программировании на C

, например, файл f1.txt будет в следующемформат

f1.txt
123456 yourname 987654
564566 test 454545

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Чтобы прочитать одну запись в структуре input:

fscanf( input_file, "%d %s %s", &input.student_code, input.name, input.ID )

для чтения целого числа и двух строк в соответствующие элементы.

fscanf() возвращает число отформатированныхполя назначены успешно, поэтому для отображения всех записей в файле, как пытается ваш код:

while( fscanf( input_file, "%d %s %s", &input.student_code, 
                                       input.name, 
                                       input.ID ) == 3 )
{
    printf( "student code = %d, name = %s, ID = %s\n", input.student_code,
                                                       input.name, 
                                                       input.ID ) ;
}
1 голос
/ 15 марта 2019
  1. Используйте fscanf для чтения строк, потому что вы знаете формат

  2. Сохраните значения во временных переменных

  3. Скопируйте их в правильную структуру данных: если вы не знаете, сколько студентов используют динамический массив или список.

РЕДАКТИРОВАТЬ: массивы разрешают произвольный доступ, с другойручные списки разрешают только последовательный доступ.Вот моя попытка использования списков:

typedef struct student
{
    int student_code;
    char name[20];
    char ID[20];
    struct student* next;
}student_t;

typedef struct list_s
{
    int size;
    student_t* head;
    student_t* tail;
} list_t;

void list_push_back(list_t* l, int code, char n[20], char id[20])
{
    student_t* tmp = (student_t*)calloc(1,sizeof(*tmp));
    tmp->student_code = code;
    strncpy(tmp->name, n, 20);
    strncpy(tmp->ID, id, 20);

    if (l->head == NULL)
    {
        l->head = tmp;
        l->tail = tmp;
        l->size++;
        return;
    }

    l->tail->next = tmp;
    l->size++;
}

void list_print(list_t* l)
{
    student_t* it = l->head;

    while (it)
    {
        fprintf(stdout, "%d %s %s\n", it->student_code, it->name, it->ID);
        it = it->next;
    }
}

int main(int argc, char* argv[])
{
    FILE *input_file;
    struct student input;

    input_file = fopen("f1.txt", "r");
    if (input_file == NULL)
    {
        fprintf(stderr, "\nError!\n");
        exit(1);
    }

    list_t* list = (list_t*)calloc(1,sizeof(*list));

    char tmp_name[20];
    char tmp_id[20];
    int tmp_code = 0;

    while (fscanf(input_file, "%d %s %s", &tmp_code, tmp_name, tmp_id) != EOF)
    {
        list_push_back(list, tmp_code, tmp_name, tmp_id);
    }

    fclose(input_file);

    list_print(list);

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