gpt4 book ai didi

C - printf 输出根据后续代码而变化

转载 作者:行者123 更新时间:2023-11-30 14:51:42 25 4
gpt4 key购买 nike

前言:我只是在搞C,所以请原谅我的无能。这个问题的原因可能是基本的。

问题:我正在尝试读取文件并通过套接字通过 http 提供该文件。由于某种原因,printf先前读取的文件的输出根据包含的后续代码的数量而变化。

这是我的代码。

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#include <netinet/in.h>


int main()
{

// open a file to serve
FILE *file;
file = fopen("index.html", "r");
if (file == NULL)
{
printf("Failed to open file.");
exit(EXIT_FAILURE);
}

// Get file content
char file_content[1024];
if (fgets(file_content, 1024, file) != NULL)
{

fclose(file);

// Add header to file content
char http_header[2048] = "HTTP/1.1 200 OK\r\n\n";
strncat(http_header, file_content, 1028);

// This output varies depending on inclusion of proceeding code.
printf("%s", http_header);

// create a socket
int server_socket;
server_socket = socket(AF_INET, SOCK_STREAM, 0);

// define the address
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8001);
server_address.sin_addr.s_addr = INADDR_ANY;

bind(server_socket, (struct sockaddr *) &server_address, sizeof(server_address));
listen(server_socket, 1);

int client_socket;
while (1)
{
client_socket = accept(server_socket, NULL, NULL);
send(client_socket, http_header, sizeof(http_header), 0);
close(client_socket);
}
return 0;
}

}

如果我注释掉printf之后的所有内容声明,我得到了预期的输出..

HTTP/1.1 200 OK

<html><body>Hi</body></html>

但是如果我运行所有代码,我会得到这个..

HTTP/1.1 200 OK

如果我可以改进我的问题,请告诉我如何改进。谢谢。

最佳答案

Mark Benningfield 和 Yano 帮助我理解了这个问题,非常感谢你们俩。

当你执行printf()时,每一行都进入 buffer ,而不是直接进入终端窗口。 。

缓冲区中的每一行都必须刷新才能在终端中显示。缓冲区可以通过these events自动刷新

\n 结尾的字符串会自动刷新,这就是为什么第一行HTTP/1.1 200 OK \r\n\n显示良好。第二行<html><body>hi</body></html>不以 \n 结尾,或触发任何其他自动刷新事件,因此不会显示。

通常这不是问题,因为当程序终止时,缓冲区会自动刷新,并且通过 printf 进入缓冲区的所有行显示在终端中。由于我的程序在底部进入了无限的 while 循环,因此程序永远不会终止,并且缓冲区永远不会刷新。

调用fflush(stdout)之后printf强制写入 stdout的整个缓冲区。

More info on fflush

关于C - printf 输出根据后续代码而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com