【发布时间】:2013-09-11 05:45:04
【问题描述】:
我没有使用fscanf() 的经验,也很少使用FILE 的功能。我有正确确定客户端是否请求现有文件的代码(使用stat(),它还确保它不是目录)。我将省略这部分,因为它工作正常。
我的目标是向客户端发送一个带有 HTTP 标头(一个字符串)和正确读取的数据的字符串,我想它必须在某个时候变成一个字符串,以便与标头连接以发送回。我知道+ 不是有效的C,但为了简单起见,我想发送这个:headerString+dataString。
下面的代码似乎适用于文本文件,但不适用于图像。我希望单独阅读每个字符可以解决问题,但事实并非如此。当我将浏览器 (Firefox) 指向我的服务器以查找图像时,它告诉我“图像(图像的名称)无法显示,因为它包含错误。”。
这是应该将文件读入httpData的代码:
int i = 0;
FILE* file;
file = fopen(fullPath, "r");
if (file == NULL) errorMessageExit("Failed to open file");
while(!feof(file)) {
fscanf(file, "%c", &httpData[i]);
i++;
}
fclose(file);
printf("httpData = %s\n", httpData);
编辑:这是我发送的:
char* httpResponse = malloc((strlen(httpHeader)+strlen(httpData)+1)*sizeof(char));
strcpy(httpResponse, httpHeader);
strcat(httpResponse, httpData);
printf("HTTP response = %s\n", httpResponse);
数据部分产生 ????对于图像,但对于 html 文件正确的 html。
【问题讨论】:
-
读取二进制文件需要:
file = fopen(fullPath, "rb"); -
我刚试过(并在上面更新),图像产生????
-
您需要担心数据中的空字节;
%s格式将在第一个停止。您应该使用while (fscanf(file, "%c", &httpData[i]) == 1) i++;(在循环中使用feof()几乎总是一个错误——特别是当您不检查来自fscanf()的返回时,如您显示的代码中的错误)。您需要考虑 CRLF 行尾; HTTP 要求它们用于文本文件。您不能将strcpy()用于数据;您需要使用memmove()或memcpy()。 -
@Jonathan Leffler,您能否发表评论的两部分作为答案。我想我理解第一部分,但我不知道如何使用第二部分。