2017-03-01 1 views
-1

파일을 열면 끝까지 이동 한 다음 처음으로 돌아가서 분할 오류 (코어 덤프)가 발생합니다. 이거 뭐야?파일 되감기 후 실제로 이상한 분할 오류

... 
FILE *passkey; 
passkey = fopen("pass.key", "r+"); 
fseek(passkey, 0, SEEK_END); 
filesize = ftell(passkey); 
rewind(passkey); 
... 

되감기로 인해 세그먼트 오류가 발생합니다. 처음에는 fseek와 동일합니다. 왜 이렇게합니까?

+8

** 반드시 사용했던 네 가지 기능 모두에서 반환 된 값을 확인해야합니다. 그들 중 누구라도 실패 할 수 있고 어떤 실패라도 세그 폴트로 이어질 수 있습니다. – DyZ

+0

패스를 확인 했습니까? 파일이 존재합니까? – soasme

+0

내가 그랬다. 모든 것이 되감기 전까지 작동한다. 필자는 이것들에 의해 리턴 된 모든 값을 테스트했고, 이것들을 모두 테스트 한 후에 printf 문을 두었습니다. 되감기입니다. – picklesrevil

답변

0

C에서 fseek 기능으로 인한 segault는 거의 항상 실패한 fopen으로 인해 발생합니다. 열려고하는 파일이 실제로 있는지 확인하십시오. 어떤 경우에 r + 매개 변수를 사용하여 새 파일을 만든 다음 잘못 입력 한 경우 r + 에 C로 새 파일을 만들지 않습니다. 가능한 경우 언제든지 fopen의 반환 값을 확인하십시오. 단지 되감기가 파일 시작 부분에있는 fseek라는 것을 알지 못했을 경우에 대비하여 문제가 발생할 가능성이 높습니다. 희망이 도움이!

해피 코딩!

+0

확인. 주석에 언급 된대로 모든 기능을 개별적으로 검사했습니다. 나는 패스를 안다. 키가있다. 나는 존재하게 만들었다. 나는 다른 모든 라인이 작동한다는 것을 절대적으로 확인했다. – picklesrevil

0

이것은 적절한 대답보다 확장 된 설명과 같습니다. 이 코드는 마지막 줄에 도착하지 않는 가능성이 높다

FILE *passkey; 
if (!(passkey = fopen("pass.key", "r+")) { 
    perror("pass.key"); 
    exit(EXIT_FAILURE); 
} 
if(-1 == fseek(passkey, 0, SEEK_END)) { 
    perror("pass.key"); 
    exit(EXIT_FAILURE); 
} 
if(-1 == (filesize = ftell(passkey)) { 
    perror("pass.key"); 
    exit(EXIT_FAILURE); 
} 
rewind(passkey); 

: 다음과 같은 코드 봐야한다 방법입니다. 그러나 그렇게되면 문제는 다른 곳에서 발생해야합니다. 그런 다음 메모리 디버거 (예 : valgrind 또는 Electric Fence)로 프로그램을 실행하는 것이 좋습니다.