c - 将数据从文件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.");
}
}
解决方案
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可能会写入少于预期的字符数而不会出错,并且写入必须在循环中完成,但在这种情况下,管理它是没有用的
推荐阅读
- c# - ItextSharp 不使用 c# 维护 pdf 中的列宽
- ruby-on-rails - 在其他控制器中使用设计时没有响应
- amazon-web-services - Python 代码在 AWS EC2 G4 实例上自动终止
- javascript - 从另一个函数括号传递变量
- php - 如何加入“IN”结果并检查“where” active = 1?
- api - CodeIgniter,在 $this- 响应之后调用另一个函数
- html - 是否可以在 HTML 中使用 data-* 属性来设置 CSS 中的宽度?
- c - 忽略使用 sprintf 显示数字
- apache - 匹配查询的 Apache 重写条件
- php - "error":true,"message":"required parameters are not available" while check api call using postman