나는 코드의 일부를 쓰고 있는데 그 일부는 파일에서 n- 길이 배열로 "레코드"를 읽고 있는데, n은 인수로 주어집니다. 파일의 레코드는 일정한 길이 (이 경우 1024)를 가지며 숫자, 공백 및 소문자 만 포함합니다. 각 레코드는 \ n으로 종료됩니다. 하나의 레코드를 유지하기 위해 다음 구조를 사용하고 있습니다.
typedef struct{
char rec[1024];
} record;
그리고 그 중 n 개를 추출하고 n 길이의 레코드 배열에 저장하는 코드는 다음과 같이 작성됩니다.
record * recs=malloc(n*sizeof(record));
size_t read=fread(recs,sizeof(record),(size_t)n,f);
이 작업의 출력을 확인했을 때 배열 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);
}
문제는 레코드 rec
가 0으로 끝나는 문자열이 아니라는 것입니다.
따라서를 사용하여 인쇄하면 %s
모든 레코드가 표시됩니다 '\0'
..
따라서 각각에 제로 터미네이션을 추가 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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다