当尝试使用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\n", bytesRead);
close (fp);
close(fq);
return 0;
}
答案 0 :(得分:0)
在示例bytesRead
中包含上一次对read
的调用中读取的字节数,并且while
循环的每次迭代都会覆盖现有值。
添加另一个变量totalBytesRead
,将其初始化为0,然后在循环内执行totalBytesRead += bytesRead;
。然后totalBytesRead
将保留读取的字节总数。
也就是说,您没有检查write
中的任何错误,因此该变量将包含未读取的字节(当前,例如,即使写入失败,您的代码也将继续读取。您可以添加另一个变量{同样,{1}}在每个迭代中执行与totalBytesWritten
相同的逻辑,并比较是否编写了所有已阅读的内容。