0

ソケットを介してテキスト行を読み取る関数を作成しようとしています (これは、宿題のために HTTP サーバー用に作成しているコードの一部です)。

を使用して書いているときに、ファイルへの書き込みが正常に機能しますfputc。ただし、文字をバッファーにコピーしてから、バッファーfprintf全体をファイルに出力しようとすると、出力が得られないようです。

コードは次のとおりです。

int read_line(int fd, char *buffer, int size) {
    char *broken_buffer = (char*) malloc(sizeof(char) * 8096);
    char next = '\0';
    char err;
    int i = 0;
    FILE *f = fopen("read_line2.txt", "w");
    while (i < size - 1 && next != '\n') {
        err = read(fd, &next, 1);
        if (err > 0) {
            if (next == '\r') {
                err = recv(fd, &next, 1, MSG_PEEK);
                if (err > 0 && next == '\n') {
                    read(fd, &next, 1);
                } else {
                    next = '\n';
                }
            }
            fputc(next, f); // Works
            broken_buffer[i] = next;
            buffer[i] = next;
            i++;
        } else {
            next = '\n';
        }
    }
    broken_buffer[i] = '\0';
    buffer[i] = '\0';
    FILE *out = fopen("read_line.txt", "w");
    fprintf(out, "%s\n", broken_buffer); // Does not work
    fclose(out);
    fclose(f);

    return i;
}

編集:私はこの代替機能を使用してみました:

int read_socket(int fd, char *buffer, int size) {
    int bytes_recvd = 0;
    int retries = 0;
    int total_recvd = 0;

    while (retries < MAX_RETRIES && size > 0 && strstr(buffer, ">") == NULL) {
        bytes_recvd = read(fd, buffer, size);

        if (bytes_recvd > 0) {
            buffer += bytes_recvd;
            size -= bytes_recvd;
            total_recvd += bytes_recvd;
        } else {
            retries++;
        }
    }

    if (bytes_recvd >= 0) {
        // Last read was not an error, return how many bytes were recvd
        return total_recvd;
    }
    // Last read was an error, return error code
    return -1;
}

そして、これをfprintfで印刷しても問題ありません。

EDIT2:iループ後に何らかの形で 0 であることがわかったので、最初の文字は '\0' で上書きされています。ただし、デバッグ コードを挿入してループ内の i の値を出力すると、22 までインクリメントされていることがわかりました (23 はループが中断する最終値です)。これはどのように可能ですか?結果の文字列は次のとおりです。

GET /blah.txt HTTP/1.1
4

2 に答える 2

0

問題は、両方がサーバーに接続している2つのプロセス(ありがとう、Google Chrome ...)であり、両方が何らかの形で同じファイルに書き込んでいることが判明しました。コードは正しく機能していました。

于 2013-02-22T06:17:30.167 に答える
0

Is the value of next ever 0? If it is 0 then that value will go into broken_buffer, which means that fprintf will think it's at the end of a string before you explicitly put the null there yourself.

于 2013-02-21T02:53:33.167 に答える