首页 > 解决方案 > 将数据从文件X复制到文件Y C中的程序

问题描述

我尝试用 C 语言编写基本程序,该程序将数据从文件复制到另一个以给定的源路径、目标路径和缓冲区大小作为输入。我的问题是目标文件充满了垃圾或其他东西,因为它比源文件大(根据缓冲区大小变大)并且无法打开。我如何读取和写入源中的字节?我在 linux 中工作,这是实际复制的部分:

char buffer[buffer_size];

int readable=1;
int writeable;
while(readable != 0){
    readable = read(sourcef, buffer, buffer_size);
    if(readable == -1){
        close(sourcef);
        close(destf);
        exit_with_usage("Could not read.");
    }
    writeable = write(destf, buffer, buffer_size);
    if(writeable == -1){
        close(sourcef);
        close(destf);
        exit_with_usage("Could not write.");
    }
}

标签: clinux

解决方案


writeable = write(destf, buffer, buffer_size);

一定是

writeable = write(destf, buffer, readable);

目前你写的不是你读的字符数而是所有的缓冲区,所以输出文件太大了

您还错误地管理了输入文件的结尾

读取的返回值为:

  • 成功时,返回读取的字节数(零表示文件结束)

  • 出错时返回 -1

提案 :

/* you already check input and output file was open with success */

char buffer[buffer_size];

for(;;){
  ssize_t readable = read(sourcef, buffer, buffer_size);

  if(readable <= 0){
    close(sourcef);
    close(destf);
    if (readable != 0)
      /* not EOF */
      exit_with_usage("Could not read.");
    /* EOF */
    break;
  }

  if (write(destf, buffer, n) != n) {
    close(sourcef);
    close(destf);
    exit_with_usage("Could not write.");
  }
}

我想exit_with_usage打电话exit()所以不返回

请注意,理论上write可能会写入少于预期的字符数而不会出错,并且写入必须在循环中完成,但在这种情况下,管理它是没有用的


推荐阅读