2013-05-18 3 views
0

내 C 프로그램의 fclose()가 잘못된 액세스를 유발하는 이유를 알 수 없습니다. 그것은 잘 작동하고 문자열을 서로 같지 않을 때 인쇄 할 if 조건을 변경하고 갑자기 문제가 발생하기 시작했습니다. 떨어져 나쁜 액세스 오류에서, 그것은 또한 "NEWFILE.TXT"fclose가 exc_bad_access를 일으키는 경우

#include<stdio.h> 
    #include<stdlib.h> 
    #include <string.h> 



    int main() 
    { 

     FILE * cFile; 
     FILE *outputfile; 

     FILE *newfile; 
     cFile = fopen("input.in", "r"); 
     if (cFile == NULL){ 
     printf("bad input file"); 


     } 
     newfile = fopen("newfile.txt", "w+"); 


    if (newfile == NULL){ 
     printf("bad newfile"); 

    } 
     char tempstring[15]; 
     char tempstring2[15]; 

      //get each line in the cFile 
     while (fscanf(cFile, "%15s", tempstring) != EOF) { 


      outputfile = fopen("outputlotnum.txt", "r"); //open/(or reopen) outputfile to check lines 
      if (outputfile == NULL){ 
     printf("bad outputfile"); 
     } 
      //get each line in the outputfile 
      while(fscanf(outputfile, "%15s", tempstring2) != EOF){ 

       //if the line from cFile doesn't match the line from outputfile, 
       //then go ahead and print the line to the newfile.txt 
       if (strcmp(tempstring, tempstring2) != 0){ 

        fprintf(newfile,"%15s \n", tempstring2); 

       } 

       //else don't print anything and continue on to the next line 

      } 

      fclose(outputfile); //close the outputfile after checking all the lines for a match 

     } 

     fclose(newfile); //throws bad access 
     fclose(cFile); 


     return 0; 

    } 
+2

'fopen()'이 실패하면'NULL'을 반환합니다. ** 확인해보십시오. ** –

+0

나는 그것들을 검사하지 않았고 아무도 NULL을 반환하지 않았습니다. – user1066524

+0

세 파일이 이미 있기 때문에 정말 이상합니다. 세 개 중 두 개는 이미 어떤 종류의 텍스트로 채워져 있으며 newfile은 비어있는 텍스트입니다. – user1066524

답변

1

라이브러리 함수에 대한 몇 가지 이유가 함수에 잘못된 매개 변수를 전달하거나 메모리 필을 가지고 포함 오류있는 SEG에 아무것도 인쇄되지 않습니다. 귀하의 경우에 하나 또는 둘 다 임시 문자열 배열을 스택에 오버플로하고 파일 핸들이 손상된 것으로 의심됩니다. 일반적으로 읽는 문자열이 버퍼에 들어갈 것을 보장 할 수 없다면 fscanf/scanf를 버퍼에 넣는 것이 안전하지 않습니다.

열기를 확인한 후 파일 핸들을 열기 직전과 닫기 전에 다시 인쇄 할 수 있습니다. 그들은 동일해야합니다. 그들이 아닌 경우 실수로 덮어 썼습니다.

+0

% 15s와 함께 fscanf를 시도했지만 여전히 오류가 발생합니다. – user1066524

+0

그리고 각 파일 핸들을 검사하여 null이 아니고 null이 아닌지 확인했습니다. 나는 newfile에 쓰기 만하고 w + 모드로 열었다. – user1066524

+0

NULL이되는 것은 아닙니다. fscanf가 파일 핸들을 덮어 쓰면 파손되지만 NULL이 아닙니다. 파일 I/O 라이브러리는 전달한 파일 핸들이 유효하다는 것을 거의 확인하지 않고 제공 한 핸들을 기반으로 내부 데이터 구조를 찾습니다 (잘못된 경우에도). – jarmod