2019.01.12
今天主要学了 系统调用的文件访问和C语言库函数的文件访问。其中有很多要点。
1.在对文件进行操作的时候要加一个if判断是否出错
fd = creat("/home/xxx/hello.c", S_IRUSR | S_IWUSR); //文件名(路径) 文件的权限
if (-1 == fd) //返回-1表示出错
{
printf("%d\n", errno);
perror("creat");
exit(1); //记得要加相关的头文件
}
2.读文件里的内容时,缓存区的大小减一,因为字符串最后以\0结尾,不然有可能产生乱码
ret = read(fd_from, buf, sizeof(buf) - 1);
3.读文件内容要把文件指针移到文件开始的位置,不然读的是文件内容以后空的数据
//lseek(fd, 0, SEEK_SET); //相对文件开头移动0个字节
//lseek(fd, strlen(buf) * -1, SEEK_CUR); //相对当前位置,向前移动xxx个字节
lseek(fd, strlen(buf) * -1, SEEK_END); //相对文件末尾,向前移动xxx个字节
fseek(fp, 0, SEEK_SET); //移动文件指针,相对文件开头移动0个字节
4.在进行缓存区操作后要将缓存区清空
memset(buf, 0, sizeof(buf));
close(fd_from);
close(fd_to);
5.用ftell可以得到文件大小
length = ftell(fp); //返回文件指针距离文件开头的长度
疑惑:
拷贝这一段死循环 为什么是ret = write(fd_to, buf, ret);?而不是write(fd_to, buf, ret) = ret;
while (1)
{
ret = read(fd_from, buf, sizeof(buf) - 1);
if (ret == -1)
{
perror("read");
}
else if (0 == ret) //文件读完
{
printf("拷贝完毕!\n");
break;
}
ret = write(fd_to, buf, ret);
if (-1 == ret)
{
perror("write");
}
memset(buf, 0, sizeof(buf));
}