0

我是 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);               
        }

客户的相关部分如下

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

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

2 回答 2

2

read() 不为空终止它的缓冲区。fputs需要一个空终止缓冲区。

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

您可以使用以下内容添加终止符:

    int n = 0;
    char buffer[SOME_CONSTANT];
    while((n = read(sockfd, buffer, sizeof(buffer - 1))) != -1){
        buffer[n] = 0;
        fputs(buffer, fp);
    }

还要注意读取调用中buffervs的声明和使用。&buffer

最后,查看 Joachim Pileborg 的所有建议!

于 2013-11-10T16:15:57.803 回答
2

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

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

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

于 2013-11-10T16:18:26.770 回答