2017-12-04 1 views
-1

여기 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); 
    }  
} 

지금 :

+1

를 실행하는 것이 문제를 디버깅하는 가장 좋은 방법 : 따라서, 당신은 fread()

fread()에 첫 번째 인수로 Animal에 이중 포인터를 전달하는이 문서에 따라 첫 번째 인수로 하나의 포인터를 취 GDB 또는 LLDB와 같은 디버거에서 –

+0

어디서 문제가 발생했는지 알지만 어떤 이유로 인해 해결 방법을 찾지 못했습니다. fread() 문에서 발생합니다. – kbreezy

+1

구조체 전체를 읽을 때'sizeof (struct animal) - 1' 만 읽는 이유는 무엇입니까? –

답변

2

은 아마 당신의 문제가 있기 때문에 무슨 일이 일어나고 11 옵션 3의 경우이 코드를 사용하고있다 tempAnimalAnimal 유형에 대한 포인터입니다. while 명세서에 앞에 tempAnimal을 붙이면 메모리 주소를 얻습니다. https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm

+3

뿐만 아니라 tempAnimal에 메모리를 할당하지 못했지만 데이터를 읽는 중입니다. –

+0

아. 하지만, 이제 tempAnimal을 tempAnimal로, sizeof (구조체)를 sizeof (구조체)로 바 꾸었습니다. 여전히 어떻게 든 나에게 같은 세분화 오류를 준다 : 11. – kbreezy

+0

David Hoelzer가 말했듯이, tempAnimal에 메모리를 할당해야한다. malloc()을 호출하면 아마도 세그멘테이션 오류가 발생합니다. – Vltava

관련 문제