여기 https://drive.google.com/open?id=18olXBhRgpGyY0bhpjDSwla2XcBnWoFGM이 세분화 오류를 수정하는 방법에 대한 제안 사항이 있으십니까?
I은이를 위해이 지침을 발견 할 수있는 파일 "animals.dat"에서 입력 데이터를 읽고 있습니다 : 사용자가 3를 입력 경우, 가정되는 입력 파일 동물이. (아래 으로 정의 된) 동물 유형의 기록으로 구성되어 있으며 동물 번호를 물어보고 화면에 표시 할 동물 기록 (기록 번호를 나타내는 정수 으로 표시)을 사용자에게 요청해야합니다. 구조의 메모리 레이아웃은 다른 시스템에 다르기 때문에
#pragma pack(1)
struct animal {
short int id;
char name[20];
char species[35];
char size;
short int age;
};
에서, 프라그 팩 지시자는 동물 형의 변수를 동일한 방식으로 (동일한 배향/패딩을 사용하여 저장하도록 컴파일러 강제 : 동물 형 구조로 정의) 플랫폼에 관계없이. 이 검색 유형은 임의 파일 액세스를 사용하며 동물의 레코드 번호와 ID는 동일한 엔티티임을 유의하십시오. 예를 들어, 파일 등의 항목으로 구성되어있는 경우 :
1 알레그라, 바위 양속에 nayaur, S 5
2 알려지지 Ailurus의 fulgens, X, 10
3 아테나 Moschus fuscus을 X, 2
는 해당 파일에 3 기록이다
3, 아테나, Moschus fuscus, X,
모든 동물 2는의에 나열되어 있습니다 ID 번호에 구멍을 뚫은 경우 값이 1부터 시작하여 과 같이 표시됩니다. 2이면 이름 구성 요소에 빈 레코드를 나타내는 ""문자열이 포함되어 있다는 것을 제외하고는 구조 정보가 여전히 파일에 있습니다. 검색시 임의의 파일 처리가 사용되는지 확인하십시오. 유효하지 않은 ID가 입력되면이 예제에서 1 또는 3 이외의 값을 입력하면 프로그램에서 오류 메시지를 표시합니다. 그렇지 않으면 동물 기록이 표시됩니다. 두 경우 모두 초기 메뉴로 돌아갑니다.
이제 처음 두 옵션이 정상적으로 작동합니다. 어떤 이유로 내 변수 tempAnimal에 아무것도 저장 드릴 수 없습니다 그것은 세그먼트 오류 던지고,
#pragma pack(1)
struct animal {
short int id;
char name[20];
char species[35];
char size;
short int age;
};
typedef struct animal* Animal;
void choice3(FILE *infile) {
Animal tempAnimal;
int id;
printf("Enter ID ");
scanf(" %d", &id);
//fseek(infile,id * sizeof(struct animal),SEEK_SET);
while(fread(&tempAnimal,sizeof(struct animal) - 1,1,infile) == 1) {
printf("%d -- %s\n",tempAnimal->id,tempAnimal->name);
}
}
지금 :
를 실행하는 것이 문제를 디버깅하는 가장 좋은 방법 : 따라서, 당신은
fread()
fread()
에 첫 번째 인수로Animal
에 이중 포인터를 전달하는이 문서에 따라 첫 번째 인수로 하나의 포인터를 취 GDB 또는 LLDB와 같은 디버거에서 –어디서 문제가 발생했는지 알지만 어떤 이유로 인해 해결 방법을 찾지 못했습니다. fread() 문에서 발생합니다. – kbreezy
구조체 전체를 읽을 때'sizeof (struct animal) - 1' 만 읽는 이유는 무엇입니까? –