1.打开文件与关闭文件
(1)linux中的文件描述符fd的合法范围是0或者一个正正数,不可能是一个负数。
(2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd去指定关闭这个文件。如果在我们关闭文件前fd丢掉了那就惨了,这个文件没法关闭了也没法读写了。
2.实时查man手册
(1)当我们写应用程序时,很多API原型都不可能记得,所以要实时查询,用man手册
(2)man 1 xx查linux shell命令,man 2 xxx查API, man 3 xxx查库函数
3.读取文件内容
(1)ssize_t read(int fd, void *buf, size_t count);
fd表示要读取哪个文件,fd一般由前面的open返回得到
buf是应用程序自己提供的一段内存缓冲区,用来存储读出的内容
count是我们要读取的字节数
返回值ssize_t类型是linux内核用typedef重定义的一个类型(其实就是int),返回值表示成功读取的字节数。
3.1.3.4、向文件中写入
(1)写入用write系统调用,write的原型和理解方法和read相似(2)注意const在buf前面的作用,结合C语言高级专题中的输入型参数和输出型参数一节来理解。
(3)注意buf的指针类型为void,结合C语言高级专题中void类型含义的讲解
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
int fd = 1;
char buf[100] = {0};
char wbuf[20] = {"I love linux."};
int ret = -1;
fd = open("a.txt",O_RDWR);
if(-1 == fd ) //fd < 0
{
printf("File Open Error.\n");
}
else
{
printf("File Open Succeed. fd = %d\n",fd);
}
ret = write(fd,wbuf,strlen(wbuf));
if(ret < 0)
{
printf("Write Error.\n");
}
else
{
printf("write %d byte.\n",ret);
printf("write context is [%s]\n",wbuf);
}
ret = read(fd,buf,30);
if(-1 == ret)
{
printf("Read Error.\n");
}
else
{
printf("read %d byte.\n",ret);
printf("The context is [%s]\n",buf);
}
close(fd);
return 0;
}
(4)刚才写入成功,然后读出结果读出是0(但是读出成功了),这个问题的答案是因为write和read在使用时是从当前指针开始往后写的,当上面write完后,文件指针已经移动到了文件末尾,所以在接下来的read操作时已经到最末尾了,就没有字节可读。这时候需要使用lseek()来定位操作文件指针置于文件开头。