1

fgets()関数を使用してテキストファイル全体で特定の区切り文字を検索している場合、fgets()がEOFで無限にループしないようにするにはどうすればよいですか?

delimiter1からdelimiter2までのすべての行をstruct1[i].string1に連結しています。ここで、iはdelimiter1/delimiter2パターンのn番目のオカレンスです。このパターンは、テキストファイル全体で最後まで続きます。最後まで、delimiter2の代わりに、EOFがあります。delimiter1から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++;
    }

}   
}

ただし、このコードを実行しようとすると、無限ループに陥ります。整数「i」が何であるかを示すprintステートメントを内側のwhileループに入れましたが、テキストファイル内のdelimiter1の総数である4に固定されていたため、EOFが私に無限ループ。

どんな助けでもいただければ幸いです。

4

3 に答える 3

1

無限ループの理由は内部ループです:

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

temp_stringの値がそうでない 場合、 = 0に"Delimiter2"設定することはなく、temp_stringをNULLに設定しないとします。j

temp_string 100charを一度に読み取るため"Delimiter2"、他のチャーターを使用してファイルから読み取られる可能性があります。これが、strcmp()が読み取っても0を返さない理由"Delimiter2"です。

printfyoutemp_stringでコードをバグしてみてください。

また、ファイル内で検索strstr()する代わりに関数を使用することもできます。temp_stringのどこかに見つかった場合は有効なアドレスを返し、それ以外の場合はNULLを返します。strcmp()"Delimiter2"strstr()"Delimiter2"

于 2013-03-27T06:02:05.863 に答える
0

temp_stringはバッファです。事前に割り当てられているか、スタック上にあるため、NULLにすることはできません。これは、内側のループが停止しないことを意味します。

内部のリターンコードを確認する必要がありますfgets()

于 2013-03-27T06:00:57.013 に答える
0

すべての入力をありがとう。内側のwhileループでそれが指摘されました

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

temp_string!=NULLが見つかりませんでした。これをに変更します

!feof(inFile)

問題を修正しました。

于 2013-03-27T17:05:23.810 に答える