2017-05-17 2 views
0

코드 조각을 쓰고 있는데 그 중 일부는 파일에서 n 길이 배열로, "인수"로 주어진 "레코드"를 읽는 것입니다. 파일의 레코드는 길이가 일정하며 (이 경우 1024) 숫자, 공백 및 낮은 문자 만 포함합니다. 각 레코드는 \ n로 끝납니다. 내가 출력을 선택하면fread를 사용하여 파일에서 구조체로 데이터 읽기

record * recs=malloc(n*sizeof(record)); 
size_t read=fread(recs,sizeof(record),(size_t)n,f); 

: 기록 중 N 추출 및 기록의 N 길이의 배열에 저장

typedef struct{ 
char rec[1024]; 
} record; 

그리고 코드 이런 식으로 : 나는 하나 개의 기록을 유지하기 위해 다음과 같은 구조를 사용하고 있습니다 이 작업 중 array recs의 첫 번째 요소에는 배열의 각 요소에 하나를 유지하는 대신 모든 레코드가 포함되어 있고, 두 번째 요소는 첫 번째 요소를 제외한 나머지 요소가 포함됩니다. 배열의 다른 요소에 각 레코드를 저장해야한다고 생각했기 때문에 나는 잃어 버렸습니다.

if((f=fopen(argv[2],"r"))==NULL){ 
     perror("error opening file\n"); 
     exit(1); 
    } 

for(int i=0;i<(int)read;i++){ 
     printf("record number %d\n %s\n",i,recs[i].rec); 
    } 
+0

기록에서 기록하는 코드 및 '파일을 fopen's 것 또한 코드를 제시해주십시오. – dasblinkenlight

+0

@ dasblinkenlight 귀하의 제안에 따라 제 질문을 수정했습니다. –

+1

''r "'을''"rb "'로 변경하고 도움이되는지 확인하십시오. – dasblinkenlight

답변

6

문제는 귀하의 기록 rec가 0 종료 문자열되지 않는 것입니다 : 으로는 나는 또한 배열의 파일 및 인쇄 요소를 열기위한 코드를 제공하고있어, 제안했다.

따라서 '\0'이 나타날 때까지 인쇄가 계속되기 때문에 %s을 사용하여 인쇄하면 모든 레코드가 표시됩니다.

따라서 각 rec에 제로 터미네이션을 추가하거나 %s보다 다른 인쇄 방법을 사용해야합니다.

BTW : recs 안에 제로 터미네이션이 없으면 실제로 정의되지 않은 동작이 있습니다.

이 작은 프로그램을 모방 문제 :

#include <stdio.h> 

struct r { 
    char c[1]; 
}; 

int main(void) { 
    int i; 
    struct r recs[4] = {{'a'}, {'b'}, {'c'}, {'\0'}}; 
             //  ^^^^^ 
             //  Just to stop printing here 
    for (i=0; i<3; i++) 
    { 
     printf("%d %s\n", i, recs[i].c); 
    } 

    return 0; 
} 

출력 :

0 abc 
1 bc 
2 c 
+0

그렇습니다 아마도 당신의 도움에 많은 감사드립니다. 나는 몇 시간 동안 혼자서 그것을 발견하지 않을 것이다. –