2013-03-20 5 views
-1

Привет, я запускаю эту программу на Linux с помощью gcc -Wall -std = c99 и a./out. Я не получаю никаких предупреждений/ошибок. Но когда я печатаю свою информацию, прочитанную из файла, я получаю сумасшедшие выходы. файл содержит:открытие/чтение текстового файла в c

A13 
B99 
C2 
D2 
E44 
F32 
G2 
H9 

и выход:

id: A 
size: 171522370 
id: C 
size: 876939826 
id: 4 
size: 843516466 

код

typedef struct record{ 

    char id; 
    int size; 

}record; 


int main() 
{ 

    record reg; 

    FILE *fp = NULL; 


    fp = fopen("idSize.txt", "r"); 


    if ((fp = fopen("idSize.txt", "r")) == NULL){ 
     printf("error opening file"); 
     exit(1); 
    } 

    fread(&reg, sizeof(reg),1,fp); 

    while (!feof(fp)){ 

     printf("id: %c\n", reg.id); 
    printf("size: %d\n", reg.size); 


    fread(&reg, sizeof(reg),1,fp); 

    } 

    fclose(fp); 

    return 0; 

} 

любая помощь будет очень признателен! спасибо Лотт

+1

Если вы хотите некоторую помощь, пожалуйста, поставить некоторые усилия форматирования кода, так что легко читать. Помогите нам помочь вам. –

+1

Извините, но это полный беспорядок. Является ли текст файла или двоичным, потому что вы его кодируете, как если бы вы читали поток байтов в структуру. Может быть, вы хотите использовать fscanf вместо этого? – OldProgrammer

ответ

3

Ваш fread читает двоичной информации из файла, а не текста, что он на самом деле содержит. B y, я имею в виду, что он ожидает найти в вашей памяти образ памяти вашей структуры, который зависит от вашей реализации.

Так, например, (хотя это все меняется в зависимости от поведения отступа вашей реализации и размеров типа), это может быть, ожидая однобайтные char следуют три заполняющих байтов, за которым следует четыре байт двоичного представления в int ,

Вместо этого вы должны использовать fscanf, который может конвертировать для вас. В качестве примера, следующий код:

#include <stdio.h> 

typedef struct record { 
    char id; 
    int size; 
} record; 

int main (void) { 
    record reg; 
    FILE *fp; 

    if ((fp = fopen ("idSize.txt", "r")) == NULL) { 
     printf ("Error opening file\n"); 
     return 1; 
    } 

    while (fscanf (fp, "%c%d\n", &(reg.id), &(reg.size)) == 2) 
     printf ("id: %c, size: %d\n", reg.id, reg.size); 

    fclose(fp); 
    return 0; 
} 

производит:

id: A, size: 13 
id: B, size: 99 
id: C, size: 2 
id: D, size: 2 
id: E, size: 44 
id: F, size: 32 
id: G, size: 2 
id: H, size: 9 
+0

Большое спасибо = D – user2188946