2012-10-12 3 views
0

저는 Dev C++를 사용하는 프로그램을 만들고 있습니다. 내 프로그램을 실행하는 동안 종료됩니다. 디버깅시 의 'segmentation fault'가입니다. 무한 루프가 될지 모르겠습니다. 문제가 while(!feof(program)) 또는 fscanf(...) 코드에있는 경우 알 수 없습니다.feof 또는 fscanf 오류

누구든지 해결할 수 있습니까? 아래에있는 내 프로그램 참조 :

이 코드 몇 가지 문제가 있습니다
#include<stdio.h> 
#include<conio.h> 
#include<string.h> 
#include<stdlib.h> 
int main() 
{ 
    fpos_t curDesStart,curDesEnd; 
    fpos_t curDesLocBackup,curDes; 
    char *label,*opc,*operands; 
    char *curMacroName; 
    FILE *namTab,*desTab,*temp,*program; 
    namTab=fopen("namTab.txt","rw"); 
    desTab=fopen("desTab.txt","rw"); 
    temp=fopen("temp.txt","w"); 
    program=fopen("program.txt","r"); 
    while(!feof(program)) 
    { 
     fscanf(program,"%[^\n]%[^\n]%[^\n]",label,opc,operands); 

     if(!strcmp(label,"MACRO")) 
     { 
      fprintf(desTab,"%s%s%s\n",label,opc,operands); 
      fgetpos(desTab,&curDesStart); 
      strcpy(curMacroName,label); 
      while(!strcmp(opc,"MEND")) 
      { 
       fscanf(program,"%s%s%s",label,opc,operands); 
      } 
      fprintf(desTab,"%s%s%s\n",label,opc,operands); 
      fgetpos(desTab,&curDesEnd); 

      fprintf(namTab,"%s%ld%ld\n",curMacroName,curDesStart,curDesEnd); 

     } 

     else 
     { 
      while(!feof(namTab)) 
      { 
       fgetpos(desTab,&curDesLocBackup); 
       fscanf(namTab,"%s%ld%ld",curMacroName,curDesStart,curDesEnd); 
       if(!strcmp(curMacroName,label)) 
       { 
        fsetpos(desTab,&curDesStart); 
        fscanf(desTab,"%s%s%s\n",label,opc,operands); 
        fprintf(temp,".%s%s%s\n",label,opc,operands); 

        do{ 
         fprintf(temp,"%s%s%s\n",label,opc,operands); 
         fgetpos(desTab,&curDes); 
        }while(curDes<=curDesEnd); 

        fsetpos(desTab,&curDesLocBackup); 
        fsetpos(namTab,0); 
       } 
       else 
       { 
        fprintf(temp,"%s%s%s\n",label,opc,operands); 
       } 
      } 

     } 
    } 
    fclose(program); 
    fclose(namTab); 
    fclose(desTab); 
    fclose(temp); 
    getch(); 
    return 0; 
} 
+0

C++은 C와 다릅니다 (하지만 dev C로 컴파일하면 코드가 C로 변경되지 않습니다). 따라서이 링크는 완전히 적용 할 수 없지만 http://stackoverflow.com/questions/5431941을 읽어보십시오./while-feof-file-is-always-wrong –

+0

'feof()'를 사용하여 입력 루프의 종료를 제어하지 마십시오. 입력 함수의 결과를 사용하십시오. 'feof()'는 파일의 끝이나 에러 ('ferror()')로 인한 것인지 아닌지를 판단하기 위해 입력이 부족한 * 후에 * 사용할 수 있습니다. –

답변

0

:

  • program.txt이 존재하지 않는 경우는 fopen() NULL
  • fscanf (%의 [돌아갑니다 .. .]) 또는 fscanf (% s)는 char 포인터를 필요로합니다.이 포인터는 문자 읽기 및 종료 널 바이트 (http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html 참조)의 공간을 충분히 제공해야합니다.
  • fscanf (% ld)는 포인터가 long이 아니라 long
0

char *에 대한 저장소를 할당하지 않았거나 다른 점을 가리 키도록 초기화하지 않았습니다. 결과적으로, 당신은 본질적으로 임의의 숫자를 fscanf에 전달하고 있으며, 이는 정의되지 않은 행동으로 이어지고, 그 중 프로그램 충돌은 가능한 하나의 육화입니다.