C чтение структуры из текстового файла

#c #file #struct

#c #файл #структура

Вопрос:

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

 1)
Andrew
Bilous
Andriyovuch
director
1
1000
2)
... and so on...
  

Можете ли вы помочь мне написать цикл, который будет считывать каждую из них в один массив структур

 struct spivrob {
    char *name;
    char *surname;
    char *pobat;
    char *posada;
    int staz;
    int oklad;
} tab[6];
FILE *fo;
fo = fopen("C:\Users\andyb\Desktop\test7.txt","r");
  

Комментарии:

1. Можете ли вы предоставить содержимое test7.txt файла?

2. Sry, я думал, что вы можете увидеть мой скриншот

3. @BenWainwright теперь все хорошо?

Ответ №1:

Я не тестировал это, кроме как для проверки его компиляции, но это должно сработать

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

char* initAndGetNextLine(FILE* fo, size_t length);
int getNextLineLength(FILE* fo);

int main()
{
   struct spivrob {
      char *name;
      char *surname;
      char *pobat;
      char *posada;
      int staz;
      int oklad;
   } tab[6];

   FILE *fo = fopen("C:\Users\andyb\Desktop\test7.txt","r");

   char*  line   = NULL;
   size_t length = 0;
   int    i      = 0;
   int    j      = -1;

   while(!feof(fo) amp;amp; !ferror(fo))  {
      int len         = getNextLineLength(fo);
      char* newString = (i %7 < 5)? initAndGetNextLine(fo, len) : NULL;
      switch(i % 7) {
        case 0: j  ;
        case 1: tab[j].name = newString; break;
        case 2: tab[j].surname = newString; break;
        case 3: tab[j].pobat = newString; break;
        case 4: tab[j].posada = newString; break;
        case 5: tab[j].staz = atoi(line); break;
        case 6: tab[j].oklad = atoi(line); break;
      }
      i  ;
   } 
}

int getNextLineLength(FILE* fo)
{
   char c;
   int i = 0; 
   do {
      c = fgetc(fo);
      i  ;
   } while(c != 'n' amp;amp; !feof(fo) amp;amp; !ferror(fo));
   fseek(fo, -i, SEEK_CUR);
   return i; 
}

char* initAndGetNextLine(FILE* fo, size_t length) 
{
   char* newString = malloc(length * sizeof(char)   1);
   fgets(newString, length, fo);
   newString[length] = '';
   return newString;
}
  

Комментарии:

1. @BenWainwright. Спасибо за ответ, но я получаю сообщение об ошибке. Компилятор сообщает: неопределенная ссылка на ‘getline’. Я думаю, это потому, что мне не нужен #include

2. Вы поместили все три включения в начало моего ответа?

3. Да, я это сделал. Я думаю, что эта функция из c , не так ли?

4. Нет, это из стандартной библиотеки C.

5. Он по-прежнему не работает, программа перестает работать, и компилятор сообщает: «Процесс завершен со статусом -1073741510». Я запускаю отладчик и вижу, что проблема находится в цикле. Я попытался добавить return 0 в func main() и fclose для файла fo, но это все еще не работает