ソケットを介してテキスト行を読み取る関数を作成しようとしています (これは、宿題のために 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