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