2016-07-26 6 views
1

동일한 프로그램에서 "wor.txt"파일을 만들었으며 쓰기 스트림을 닫았습니다. 하지만 내가 처음 실행 (내가 파일을 만들었습니다)에 액세스하려고하면 세그먼트 오류가 발생하지만이 프로그램을 다시 실행할 때 성공적으로 실행됩니다.fgetc() 분할 오류 만들기

자동 생성 된 파일을 삭제하고 프로그램을 다시 실행하면 세그먼트 오류가 발생하고 두 번째 실행시 (파일 삭제없이) 다시 실행됩니다.

참고 : 데이터 따라서는 (I 파일 관리자에서 첫 번째 실행 후 그것을 보았다)

FILE *fp1= fopen("wor.txt","r"); 

FILE *f1= fopen("wordsa.txt","ab+"); 

if((f1==NULL)||(f2==NULL)){ 
printf("f1 or f2 is null"); 
} 

char c='0'; 
while((c)!=EOF){ 
printf("Here is one marker\n"); 
    c=fgetc(fp1); //This Line gives error 
printf("Here is another marker\n"); 
    fputc(c,f1); 
}  
+2

'f1 == NULL' ->'fp1 == NULL'. 코드의 형식이 올바르다면 직접 본 것입니다. 또한 'f1'과'f2' 또는'fp1'과'fp2' 변수를 모두 호출하는 일관된 명명 규칙을 사용해야합니다. –

+1

'fp1 == NULL'을 발견 한 후 (적어도 코드에서 f2를 확인한다고 가정) –

답변

2

charEOF에 대한 충분하지의 유형을 변경 비어 있지 인 TEXTFILE에있다 int.

을 확인하면 int을 반환하므로 반환 값을 저장하고 나중에 사용하려면 동일한 데이터 형식을 사용해야합니다.

즉, f1 또는 fp1NULL 일 때 계속 UB를 만들 수있는 파일 포인터에 액세스하고 있습니다. 포인터에 액세스하는 코드에 도달하지 않도록 NULL 체크와 return 또는 exit 중 하나를 사용해야합니다.

0

잘못된 확인.

스트림 열기를 제대로 감지하려면 f2이 아니라 fp1을 확인하십시오. 그런 다음 파일이 seg fault가 아닌 제대로 열리지 않으면 정상적으로 실패합니다. 통상적으로 256 개 + 1 다른 값 (unsigned charEOF)을 반환하고 char 고유하게 구별하는 데 불충분 int cfgetc()

FILE *fp1= fopen("wor.txt","r"); 
FILE *f1= fopen("wordsa.txt","ab+"); 

// if((f1==NULL)||(f2==NULL)){ 
if((f1==NULL) || (fp1==NULL)){ 

    printf("f1 or fp1 is null"); 
} 

또한 사용한다.