将数据从文件X复制到C中的文件Y程序

时间:2019-03-18 09:30:53

标签: c linux

我试图用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.");
    }
}

3 个答案:

答案 0 :(得分:3)

writeable = write(destf, buffer, buffer_size);

必须

writeable = write(destf, buffer, readable);

当前,您不写入读取的字符数,而是写入所有缓冲区,因此输出文件太大

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

read 的返回值为:

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

  •   
  • 出错时,返回-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 可以写少于预期数量的字符而不会出错,并且写操作必须循环执行,但在这种情况下,管理该字符没有用< / p>

答案 1 :(得分:2)

read函数返回读取到缓冲区(具有buffer_size)的字节数。并非总是如此,实际读取的字节与缓冲区大小具有相同的值(如果源文件中剩余的字节不足以完全填充缓冲区,请考虑以下情况)。因此,您应该写入目标文件而不是buffer_size(write函数的第三个参数),但是要读取多少字节-这是代码中的可读变量

答案 2 :(得分:0)

当可读返回错误时,您应该退出。

while(readable != 0){

应该是

while(readable != -1){

因此,当读取文件耗尽时,可以终止该循环。

在读取整个读取文件之后,您当前看到的是,调用read失败,但是由于执行没有读取失败的退出路径,因此反复调用write。同样,write应该只写入读取的字节数。因此代码如下所示:

char buffer[buffer_size];

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