我如何获得ssize_t以输出复制的字节? [处于保留状态]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何获得ssize_t以输出复制的字节? [处于保留状态]相关的知识,希望对你有一定的参考价值。

[尝试使用ssize_t打印从文件1复制到文件2的字节数时,我似乎无法在终端上显示输出。

#include <stdio.h>
#include <fcntl.h>
#include<conio.h>
#define BUF_SIZE 1024

int main(int argc, char* argv[])
 {
   int fp, fq;
   int size = 0;
   ssize_t bytesRead, bytesWritten;

   char buffer[BUF_SIZE];

   mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IROTH | S_IXOTH; 

   fp = open(argv [1], O_RDONLY);
   if (fp == -1) {
     perror("The source file cannot be opened in read mode");
     return 1;
   }
   fq = open(argv[2], O_WRONLY | O_EXCL | O_CREAT, mode);
   if (fq == -1) {
     perror("File could not be opened in write mode");
     return 2;
   }

   while((bytesRead = read (fp, &buffer, BUF_SIZE))>0){
     bytesWritten = write (fq, &buffer, (ssize_t)bytesRead);
   }
   size = ftell(fp);
   printf("Contents of size %zd copied
", bytesRead);
   close (fp);
   close(fq);
   return 0;
}
答案

在您的示例中,bytesRead包含上次调用read时读取的字节数,并且while循环的每次迭代都会覆盖现有值。

添加另一个变量totalBytesRead,将其初始化为0,然后在循环内执行totalBytesRead += bytesRead;。然后,totalBytesRead将保留读取的字节总数。

就是说,您没有检查write中的任何错误,因此该变量将包含未写入的字节(当前,例如,即使写入失败,您的代码也将继续读取。您可以添加另一个变量totalBytesWritten作为好吧,在每次迭代中执行与totalBytesRead相同的逻辑,并比较是否写入了所有已阅读的内容。

以上是关于我如何获得ssize_t以输出复制的字节? [处于保留状态]的主要内容,如果未能解决你的问题,请参考以下文章

如何找到文件的总大小(以字节为单位)? [复制]

如何打开文件以读取文件的所有字节? [复制]

readnwritereadline

如何通过 sudo 使用输出重定向? [复制]

如何进行原子文件替换? [复制]

在 gbm 多项式分布中,如何使用预测来获得分类输出? [复制]