#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, но это все еще не работает