Intereting Posts
Что делает знак с двумя процентами (%%) в сборке gcc inline? Пустой цикл медленнее, чем непустый в C Унарные операторы и ++ или – как освободить c 2d массив Какой тип следует использовать для двоичного представления C enum? обзор кода: поиск тега обратного поиска по не-null завершенному символу char Как печатать встроенное имя функции, используемое в нашей программе, с использованием определенного файла заголовка в C? Программирование POSIX pthread Как создать сокет Unix-домена с определенными правами доступа Хорошие практики программирования для определения макросов (#define) в C int q = {1,2}; уникальный список инициализации Как получить список всех страниц, принадлежащих процессу (linux) Обход сообщений об ошибках libc, redirect из / dev / tty Почему нужно указывать указатель на массив перед передачей в качестве параметра функции с аргументом типа массива? двухмерный динамический массив (realloc в c)

Как читать данные в файле и передавать его в struct ~> C

Хорошо. У меня есть файл под названием «Graduates.txt» в моем домашнем каталоге.
У меня есть переносная программа, чтобы найти домашний каталог, и я открыл файл для чтения.
Данные в файле выглядят примерно так:

year,firstName,lastName 

Мне нужно получить эти данные из этого файла и разделить его на мою структуру:

 typedef struct alumnus { int yearGraduated; char firstName[30]; char lastName[30]; } Alumns; 

У меня есть мысль, которая может работать или не работать:
Цикл while считывает файл, используя fgets () для получения данных. Затем он копирует его в структуру … но я не знаю, как реализовать это.

Извините, если это звучит как немой вопрос, скорее всего.

 #include  typedef struct alumnus { int yearGraduated; char firstName[30]; char lastName[30]; }Alumns; int main(void) { Alumns REC1; FILE *fptr; fptr = fopen("Test.txt", "r"); fscanf(fptr, "%d,%s,%s", &REC1.yearGraduated, REC1.firstName, REC1.lastName); printf("%d, %s, %s", REC1.yearGraduated, REC1.firstName, REC1.lastName); } 

Реализовано с использованием подсказки dasblinkenlight.

  1. Использовать fgets для чтения строки из файла
  2. Используйте токенизацию строк для разделения отдельных элементов

Используйте strtok () для того же самого. например

  FILE *fp; fp = fopen("path", "r"); char string[150]; char *token; while(!feof(fp)) { if (fgets(string,150,fp)) { printf("%s\n", string); token=strtok(string,","); /*Store this token in your struct(your first element) */ } } 

3.Remember strtok () – функция, не возвращающая назад, поэтому сохраняйте результаты, возвращенные из вызова функции evey strtok ();

Ниже приведен краткий пример чтения ввода с использованием fopen() , fgets() и strtok() и форматирования вывода с использованием правильных строк формата: (здесь показан вывод)

введите описание изображения здесь

Отредактировано для отображения значений размещения в структуре Alums

  #include  typedef struct alumnus { //Note "alumnus" is not necessary here, you have Alumns int yearGraduated; //below that will satisfy naming the typedef struct char firstName[30]; char lastName[30]; }Alumns; Alumns a, *pA; //Create copy of struct Alumns to use #define FILE_LOC "C:\\dev\\play\\file10.txt" int main(void) { FILE *fp; char *tok; char input[80]; pA = &a; //initialize struct fp = fopen(FILE_LOC, "r"); //open file (used #define, change path for your file) fgets(input, 80, fp); tok = strtok(input, ", \n"); //You can also call strtok in loop if number of items unknown pA->yearGraduated= atoi(input); //convert this string in to integer tok = strtok(NULL, ", \n"); strcpy(pA->firstName, tok); //copy next two strings into name variables tok = strtok(NULL, ", \n"); strcpy(pA->lastName, tok); //note the format strings here for int, and char * printf("age:%d\n First Name: %s\n Last Name: %s\n", pA->yearGraduated, pA->firstName, pA->lastName); getchar(); //used so I can see output fclose(fp); return 0; }