2013-03-27 4 views
1

fgets() 함수를 사용하여 텍스트 파일 전체에서 특정 구분 기호를 검색하는 경우 fgets()가 EOF에서 무한 루프하지 않도록하려면 어떻게해야합니까?무한 루프에서 fgets()가 멈추다

나는 delimiter1/delimiter2 패턴의 n 번째 항목 인 struct1 [i] .string1에 delimiter1에서 delimiter2까지의 모든 라인을 연결합니다. 이 패턴은 끝까지 텍스트 파일 전체에 걸쳐 계속됩니다. 대신에 delimiter2 대신에 EOF가 있습니다. 구분 기호 1부터 EOF까지 모두 연결하려고합니다.

int i; 
while(fgets(temp_string,100,inFile) != NULL){  
if(strcmp(temp_string,"Delimiter1")==0){ //checks to see if current line is delimiter1 
     j=strcmp(temp_string,"Delimiter2"); 
     while(j!=0 && temp_string != NULL){ //Here I try to exit if it is the EOF 
      fgets(temp_string,100,inFile); 
       strcat(struct1[i].string1,temp_string); 
       j= strcmp(temp_string,"Delimiter2"); //update comparator   
     } 
     i++; 
    } 

} 
} 

그러나이 코드를 실행하려고하면 무한 루프가 발생합니다. 나는 inner "while"에 print 문을 두었다가 정수 "i"가 무엇인지를 보여 주며, 텍스트 파일에있는 delimiter1의 총 수인 4 번에서 멈추어 서 EOF가 나를 제공한다고 믿게한다. 무한 루프.

도움을 주시면 감사하겠습니다.

+0

fgets가 획득 한 문자 수를 반환하지 않습니까? – Patashu

+0

EOF를 확인하기 위해'temp_string'을 사용하는 대신,'fgets()'는 EOF/오류가 발생할 때 NULL을 반환합니다. 오류와 EOF를 구분하려면 ['feof'] (http://pubs.opengroup.org/onlinepubs/009695299/functions/feof.html)을 사용하십시오. –

+0

@Patashu 반환 유형은 'char *'입니다. 크기를 얻으려면 strlen을 사용할 수 있습니다. – CuriousSid

답변

1

이유의 반환 코드를 검사해야는 내부 루프입니다 j = 0 또한 temp_string을 NULL로 설정하지 마십시오.

temp_string을 한 번에 100 char로 읽으십시오. "Delimiter2"은 strcmp()가 "Delimiter2"을 읽는 경우에도 0을 반환하지 않는 이유 때문에 다른 charter와 함께 파일에서 읽을 수 있습니다.

temp_string을 printf하면 코드 버그가 발생합니다.

또한 strcmp() 대신 strstr() 함수를 사용하여 파일에 "Delimiter2"을 찾을 수 있습니다. strstr()"Delimiter2"이 temp_string에있는 위치, 다른 현명한 NULL을 발견하면 유효한 주소를 리턴하십시오.

+0

문제가 "Delimiter2"를 찾지 못하고 파일 끝에 도달하면 while 루프를 벗어납니다. 나는 내부 루프가 문제라는 데 동의한다.그러나 텍스트 파일의 형식은 fgets()가 끝나는 100 개의 문자 앞에 모든 행에 '\ n'이 표시된다는 것입니다. 나는 융통성 때문에 단순히 지나치다. 나는 내 temp_string의 printf로 코드를 디버그하려고 시도했는데, 모든 라인은 읽어 들여지고 temp_string은 '\ n'문자로 끝나는 전체 파일의 마지막 줄까지 정확하게 비교되고 무한 루프된다. –

+0

@SeanSenWang 네, 가능하다면 다른 버그도 있습니다. 나는 대답에서 제공 한 정보에 기초하여 대답했다. 내가 너에게이 일을 더 잘 도와 줄 수 있다면 알려줘. –

0

temp_string은 버퍼입니다. 미리 할당되었거나 스택에 있으므로 NULL이 될 수 없습니다. 그것은 내부 루프가 결코 멈추지 않는다는 것을 의미합니다. temp_string에 값이 설정되지 않습니다 다음 하지"Delimiter2" 경우

while(j!=0 && temp_string != NULL){ //Here 
    ^   ^never set to NULL 
     | never became 0 if "Delimiter2" not found 

가정 :

당신은 무한 루프에 대한 내부 fgets()

0

모든 입력에 감사드립니다. 내부 while 루프에서 그 것이 지적되었습니다.

while(j!=0 && temp_string != NULL){ 

temp_string! = NULL이 절대로 발견되지 않았습니다.

!feof(inFile) 

로 변경했습니다.

관련 문제