2013-03-20 4 views
-1

안녕하세요 저는 리눅스에서 gcc -Wall -std = c99 및 a./out을 사용하여이 C 프로그램을 실행하고 있습니다. 나는 어떤 경고/오류도 내지 않는다. 그러나 파일에서 읽은 정보를 인쇄 할 때 미친 출력이납니다.열기/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, 그 뜻은 메모리 이미지 구조에서 귀하의 구현에 따라 파일을 찾을 것으로 기대. (이 있지만 모두 구현의 패딩 행동과 형의 크기에 따라 다름) 예를 들어

그래서, 그것은 int의 4 바이트 바이너리 표현으로 다음 세 가지 패딩 바이트 다음에 단일 바이트 char를 기대 할 수있다 .

대신 변환 할 수있는 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