2

最後に出現したものを見つけて、\r\n\r\nそれより前のすべてを削除しようとしています(それを含む)。ソケットを作成してファイルをダウンロードすると、ファイルが保存されます。HTTP ヘッダーはファイルに保存されます (16 進エディターによると\r\n\r\n存在します)。しかしstrstr、MSDNrecvがcharを返すため、を使用してそれを見つけることができないように見えるので、それを見つけることができるはずですか?

    while ((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
    {
char *p = strstr(buf, "\r\n\r\n");
printf("%s", p);
exit(1);
        if (fwrite(buf, 1, tmpres, fp) != tmpres) {
            printf("Error writing buffer");
            exit(1);
        }
    }

それでも、strstr は null を返しますか?

16 進コード

0D0A0D0A がファイルに明確に書き込まれるため、何が起こっているのかわかりません。

4

2 に答える 2

3

ああ、テキスト ファイルと標準 I/O の素晴らしさ。

ファイルをテキスト モードで開くと、ネイティブの行末が変更されるため、\nディスク上の内容が異なっていても、プログラムが認識するのは行末と同じです。

\r\n行末を確認するには、ファイルをバイナリ モードで開く必要があります。

ISO/IEC 9899:2011 §7.21.2ストリーム

¶2 テキスト ストリームは、行に構成される文字の順序付けられたシーケンスであり、各行は 0 個以上の文字と終了改行文字で構成されます。最後の行に終了改行文字が必要かどうかは、処理系定義です。ホスト環境でテキストを表現するためのさまざまな規則に準拠するために、入力と出力で文字を追加、変更、または削除する必要がある場合があります。したがって、ストリーム内の文字と外部表現内の文字との間に 1 対 1 の対応がある必要はありません。テキスト ストリームから読み込まれたデータは、次の場合にのみ、そのストリームに以前に書き出されたデータと必ず等しくなります。スペース文字の直前に改行文字がありません。最後の文字は改行文字です。読み込み時に改行文字の直前に書き出されたスペース文字が表示されるかどうかは、処理系定義です。

于 2013-11-14T06:57:53.240 に答える