What makes the desert beautiful is that somewhere it hides a well.
沙漠之所以美丽,是因为在它的某个角落隐藏着一口井.
Linux的文件系统编程(1)
- 运行过程
- 框架
- 标准IO和文件IO
- 标准IO
- 文件IO(主要学)
- open函数
- 两个参数
- 三个参数
- close函数
- read函数
- write函数
%d整型输出,%ld长整型输出,
%p 输出变量的内存地址,
%o以八进制数形式输出整数,
%x以十六进制数形式输出整数,
%u以十进制数输出unsigned型数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以小数形式输出,
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
运行过程
1 . 先写一个x.c文件
然后输命令 gcc x.c 就会生成一个a.out文件
然后 ./a.out 来运行 x.c 文件
每改一次内容都要从新输 gcc x.c
2 . 如果想在交叉编译器上运行
arm-linux-gnueabihf-gcc x.c -o x -static
框架
1 . main的头文件
#include <stdio.h>
#include <stdlib.h>
2 .
argc 表示参数个数
argv 表示参数
argv可输出很多参数
标准IO和文件IO
标准IO
间接调用"系统调用函数" , 是c库函数
头文件是 “stdio.h”
不依赖于操作系统, 所以所有操作系统的调用库函数操作文件的方法是一样的
文件IO(主要学)
直接调用内核的"系统调用函数"
头文件是 “unistd.h”
依赖于操作系统
open close read write
open函数
用于打开一个文件
相关程序4.c
//头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
- O_RDONLY 只读打开
- O_RDWR 读写方式打开
- O_CREAT 文件不存在则创建
- O_APPEND 文件末尾追加
- O_TRUNC 清空文件,重新写入
- 可读=4
- 可写=2
- 可执行=1
两个参数
用于打开已经存在的文件
fd = open("./4.txt",O_RDWR)
三个参数
用于打开不知道是否存在的文件
fd = open("./4.txt", O_CREAT | O_RDWR, 0666)
666:表示权限为644 rw- r-- r–
完整程序
close函数
用于关闭一个文件, 因为fd的数量是1024, 所以调用文件后要关闭文件,释放fd
相关程序5.c
//头文件
#include <unistd.h>
完整程序
read函数
用于读取一个文件
相关程序6.c, 6.txt
//头文件
#include <unistd.h>
当6.txt刚被创建, 没有内容时, 不会报错, ret<0时, 才会报错
当6.txt里面写的"hello"时, 虽然要去读32个字节,hello只有5字节, 但是不会报错
当第一次已经读完了6.txt的内容, 第二次读时, ret就是0
6.c的代码
#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于open
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> //用于close,read
int main(int argc, char *argv[])
{
int fd; // fd是文件描述符,如果文件存在,fd=3,如果不存在,fd<0
char buf[32] = {0}; //定义一个buf来放读出的字符,[32]:有32字节的空间,{0}:已清零
ssize_t ret; // read的返回值是ssize_t型
fd = open("./6.txt", O_CREAT | O_RDWR, 0666); // O_RDWR 读写方式打开, O_CREAT 文件不存在则创建;0666:0表示八进制,666表示权限
printf("fd is %d\n", fd);
ret=read(fd,buf,32); //读fd的32字节放入buf
printf("buf is %s\n", buf); //buf表示读的具体的字符
printf("read is %d\n", ret); //ret表示读了几个
// ret = read(fd, buf, 32); //读fd的32字节放入buf
// printf("buf is %s\n", buf); // buf表示读的具体的字符
// printf("read is %d", ret); // ret表示读了几个
close(fd); //关闭
}
write函数
用于写, 如果要写文件, 就要配合O_RDWR使用
相关程序7.c, 7.txt
//头文件
#include <unistd.h>
可直接输出在命令行
向7.txt里面写hello
7.c代码
#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于open
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> //用于close,read,write
int main(int argc, char *argv[])
{
int fd; // fd是文件描述符,如果文件存在,fd=3,如果不存在,fd<0
char buf[32] = {0}; //定义一个buf来放读出的字符,[32]:有32字节的空间,{0}:已清零
fd = open("./7.txt", O_CREAT | O_RDWR, 0666); // O_RDWR 读写方式打开, O_CREAT 文件不存在则创建;0666:0表示八进制,666表示权限
printf("fd is %d\n", fd);
write(fd, "hello", 5); //在7.txt里写入hello,5表示字节数,要配合O_RDWR使用
printf("写好了\n");
close(fd); //关闭
}