0
printf("ok before fgets\n");
while ( (fgets(buff, sizeof(buff), fi)) != NULL)
{
    printf("ok after");
    if(write(connfd,buff,strlen(buff)) != strlen(buff))
    {
        printf("write() failed\n");
        close(connfd);
        exit(1);
    }
}

これがコードです。コードは「okbeforefgets」を出力しますが、「okafter」を出力することはありません。何が問題なのかしら。

情報が足りない場合は、ネットワーク通信プログラムを書いています。そして、クライアントプログラムが強制終了されるとすぐに、このプログラムはスタックから解放され、いくつかの「okafter」を出力します。ネットワークに関連しているようですが、fgets()はどのようにしてネットワークに関連するローカルファイルを作成できますか?私は実際にこのファイルをリモートクライアントに送信しようとしていますが、送信する前にバグが発生しているようです。


fgets()チャットで話し合った結果、問題はまったく問題ではなく、ネットワークコードであることが明らかになりました。ループ内の診断メッセージには改行がないため、生成時に診断出力が表示されませんでした。


Jonathan Lefflerのおかげ で、問題は解決しました。printf( "ok after"); 改行が印刷されていないため、情報は表示されませんでした。したがって、改行を追加することによって:printf(ok after \ n); 「okafter」が印刷されていることがわかります。

4

2 に答える 2

2

2 つの可能性があります。

  • fgets() でエラーが発生し、NULL が返されたため、while ループに入ることはありません。

また

  • fgets は sizeof(buff) 文字、改行、または EOF を待機しています:

fgets() 関数は、n-1 バイトが読み取られるか、<newline> が読み取られて s に転送されるか、またはファイル終了条件が検出されるまで、ストリームから s が指す配列にバイトを読み取ります。その後、文字列は null バイトで終了します。

http://pubs.opengroup.org/onlinepubs/007904875/functions/fgets.html

行き詰まっていると言うので、2番目のオプションを示します。

乾杯

于 2012-10-24T03:23:03.000 に答える
0

(私のMac OS 10.5ボックスにあるもの)のmanページからfgets

fgets() および gets() 関数は、ファイルの終わりとエラーを区別しません。呼び出し元は、feof(3) と ferror(3) を使用して、どちらが発生したかを判断する必要があります。

したがって、この時点では、問題を診断するのに十分なデータが私たち (またはあなた自身) に提供されていません。


(3)そこにあるのは、UNIXマニュアルのどのセクションを参照するかを示しているだけであり、それらの関数のパラメーターとは何の関係もないことに注意してください。

于 2012-10-24T03:17:50.283 に答える