2013-03-13 3 views
1

Я пытаюсь прочитать из файла. Я использую fread(), но я не уверен, правильно ли я это сделаю. Я хочу, чтобы создать массив структур и продолжить «F-чтение» из файла в массив следующим образом:Чтение из файла в массив

//Get size of file 
struct stat st; 
stat(document, &st); 
int size = st.st_size; 

//Create appropriate array size of structs 

struct Person person[size]; 

for(j = 0; j < size; j++) { 
    fread(person[j].name, 1, 16, fp); //each name is truncated to 15 bytes on the file 
    fread(person[j].text, 1, 24, fp); //text is truncated to 24 on the file 
} 

структура Person выглядеть так:

struct Person { 
    char name[16]; 
    char text[24]; 
}; 

Могу ли я с помощью Fread() правильно? Спасибо.

ответ

0

Вы должны проверить, если вызов Fread функции удался при чтении ожидаемого числа байт из потока данных:

//Get size of file 
struct stat st; 
int name_bytes_read, text_bytes_read; // If using C11, use size_t instead 
stat(document, &st); 
int size = st.st_size; 


//Create appropriate array size of structs 

struct Person person[size]; 

for(j = 0; j < size; j++) { 
    name_bytes_read = fread(person[j].name, 1, 16, fp); //each name is truncated to 15 bytes on the file 
    if (name_bytes_read != 16) { 
     fputs ("Error reading name record", stderr); 
     exit(-1); 
    } 
    text_bytes_read = fread(person[j].text, 1, 24, fp); //text is truncated to 24 on the file 
    if (text_bytes_read != 24) { 
     fputs ("Error reading text record", stderr); 
     exit(-1); } 
} 

Далее http://www.thegeekstuff.com/2012/07/c-file-handling

+0

Спасибо за совет. Попробовав ваше предложение, я получаю сообщение об ошибке «Ошибка чтения записи имени» ... Я считаю, что это для последнего fread(), когда читать нечего. Я прав? Как я могу это исправить? – user1889966

+0

fread() может быть несколько ... хрупким ... при анализе файла данных таким образом. Вы можете использовать fgets() для получения строки за раз, а затем разбор строки, возможно, с помощью sscanf(). –

1

Приведенный ниже код достаточно внутри для цикла

fread(person[j], sizeof(struct Person), 1, fp); 
+0

действительно должен быть 'fread (person + j, sizeof (struct Person), 1, fp)' первый аргумент должен быть указателем, а Person не является типом в C, struct Person is. –

0

Increment j by sizeof (struct Person), чтобы избежать проблем с fread Альтернативно, вы можете использовать feof для проверки конца файла

Смежные вопросы