昨天在学习linux里的文件IO时遇到一个问题,我不太懂想请大家指教指教,昨天教师布置了一个任务用文件IO完成一个简单的cp 命令,要求是可以拷贝二进制文件,下面是我的代码。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#define NUM 100
int main(int argc, const char *argv[])
{
if (1 == argc)
{
printf("please input source file name to copy\n");
return -1;
}
if (2 == argc)
{
printf("please input destination file name\n");
return -1;
}
int fd1 = open(argv[1], O_RDONLY);
int fd2 = open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0764);
char wr_name[30] = {0};
if (-1 == fd2)
{
perror(argv[2]);
return -1;
}
char buf[NUM];
while (0 != read(fd1, buf, NUM))
{
write(fd2, buf, NUM);
memset(buf, 0, NUM);
}
close(fd1);
close(fd2);
return 0;
}
代码是可以实现教师说的任务的,但我又一个地方不太理解,就是在write()这个函数这里,由于我把write的第三个参数写死了,所以在buf里的大小不足NUM也就是100时,会向文件中写入readi()读到的内容,然后会在后面写入若干个二进制的0直到够write()中写的NUM的个数,那么当我用这个可执行文件去拷贝二进制文件时,拷贝后的文件一定是大于源文件的,我不理解的是为什么拷贝后的文件可以像源二进制文件一样可以运行、查看,我觉的应该会出现错误的,难道在二进制文件的末尾补0,对二进制文件没有影响吗?为什么会这样呢?