c - 在 C 中传输文件交付损坏的数据

标签 c sockets file-io

我是 C 编程的新手。我正在编写一个客户端从服务器复制文件的函数。然而,当我打开我新创建的文件时,它包含很多额外的字符。如何防止它复制无用的数据?

服务器的相关部分如下

            if (file = fopen(buf, "r")){                
            //send the file     
//              while(fgets(buffer, 1024, file) != NULL){
//                  res = write(new_fd, &buffer, sizeof(buffer));
//              }

            while(!feof(file)){
                fscanf(file,"%s",buffer);
                write(new_fd, &buffer, sizeof(buffer));
            }               
            fclose(file);               
        }

客户端相关版 block 如下

        fp = fopen ("testfile", "w");

        while(read(sockfd, &buffer, sizeof(buffer)) != -1){
            fputs(buffer, fp);
        }
        fclose(fp);

最佳答案

两件事:首先不要做 while (!feof(...)),它不会像您期望的那样工作。原因是 EOF 标志直到读取操作失败之后才设置,因此您将在文件已经到达末尾时调用一次fscanf。而不是 while (fscanf(...) == 1)

其次,根据您声明buffer 的方式,不要使用&buffersizeof(buffer)。无论是在发送者还是接收者中。如果 buffer 是指针,则 &buffer 将返回指向该指针的指针,而 sizeof(buffer) 将返回指针的大小,而不是它指向什么。此外,如果 buffer 是一个数组,那么它可能不会被输入完全填充,那么为什么要发送不需要的数据呢?仅发送 strlen(buffer) + 1 字节(+1 用于字符串终止符)。

哦,还有第三件事,不要使用 fscanf 来读取一行,而是使用 fgets。或者甚至更好,为了更有效,使用 fread 来填充完整的缓冲区并在更少的调用中将其全部发送。

关于c - 在 C 中传输文件交付损坏的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891951/

相关文章:

c - 我的c代码有什么问题

c - 将数组元素(结构)传递给函数

c - 绕过 tcp/ip header 的原始套接字

c++ - 奇怪的行为

python - 将指针字典保存到文件

c# - 寻找类似于 Path.Combine 的东西来导航文件夹

c - 为什么具有相同处理器(intel x86_64)的不同PC上的相同C代码的汇编语言代码不同

C:指向二维数组的指针

我可以在linux中查看tcp套接字缓冲区的数据来检查数据是否是我想要的

java - 如何使用java套接字通过两个不同的wifi连接两台电脑?