首页 > 解决方案 > 尝试从本地 HTTP 服务器写入文本文件

问题描述

我正在使用使用 C 脚本生成的本地服务器来简单地从客户端获取数据并将其写入文本文件。文本文件每次都是空白的。这可能是一些愚蠢的错误,但我似乎无法破解它,对不起,如果我的经验不足在这里显示得太多。以下是主要的,其余代码效果很好(打开服务器,接收/打印客户端数据到终端)。

    while(1)
    {
        FILE *f = fopen("data.txt", "w");
        if (f == NULL)
        {
            printf("Error opening file\n");
        }
        printf("\n+++++++ Waiting for new connection ++++++++\n\n");
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0)
        {
            perror("In accept");
            exit(EXIT_FAILURE);
        }

        char buffer[30000] = {0};
        valread = read( new_socket , buffer, 30000);
        char str[256];
        sprintf(str, "%ld", valread);
        fputs(str,f);
        fprintf(f,"\n");
        fflush(f);
        printf("%s\n",buffer );
        write(new_socket , hello , strlen(hello));
        close(new_socket);
        fclose(f);
    }

标签: c

解决方案


大概您在服务器运行时正在查看文件,不是吗?

然后你的循环很可能是在等待被调用accept()的客户端连接。在程序的这一点上,fopen("data.txt", "w")如果文件不存在则文件被打开,如果文件存在则截断它。无论哪种情况,文件似乎都在那里,但为空。

要解决此问题,您有多种选择:

  1. 您在循环的每一圈创建一个新文件名。这样旧的内容就不会被新的内容覆盖。
  2. 返回后打开文件accept()。这样,文件将在短时间内被打开、写入和关闭,而不会被人察觉。

顺便说一句,你的构造:

    char str[256];
    sprintf(str, "%ld", valread);
    fputs(str,f);
    fprintf(f,"\n");

相当复杂。这更清晰,不需要用户提供的缓冲区:

    fprintf(f, "%ld\n", valread);

推荐阅读