我是 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
的方式,不要使用&buffer
或sizeof(buffer)
。无论是在发送者还是接收者中。如果 buffer
是指针,则 &buffer
将返回指向该指针的指针,而 sizeof(buffer)
将返回指针的大小,而不是它指向什么。此外,如果 buffer
是一个数组,那么它可能不会被输入完全填充,那么为什么要发送不需要的数据呢?仅发送 strlen(buffer) + 1
字节(+1
用于字符串终止符)。
哦,还有第三件事,不要使用 fscanf
来读取一行,而是使用 fgets
。或者甚至更好,为了更有效,使用 fread
来填充完整的缓冲区并在更少的调用中将其全部发送。
关于c - 在 C 中传输文件交付损坏的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891951/