Map手册
Map 2 :查看系统调用的
Mao 3:查看库函数的
标准IO文件打开、关闭函数
FILE *fopen(const char *path , const char *mode)
FILE返回类型是一个结构体,称之为流
Path :包含文件名的路径
Mode
返回值:出错返回NULL,使用fopen函数必须判断是否为空
r:只读
w:只写
a:以只写方式打开文件,若文件不存在则创建,向文件写入的数被追加到文件内容末尾
a+以读写方式打开文件
文件打开的代码:
标准IO的字符输入:
int fgetc(FILE *stream); //函数
int getc(FILE*stream); .//宏
int getchar(void); //只能用来读取标准文件的输入,比如键盘输入,不能读取普通文件内容
成功时返回读取的字符,若未读到文件返回-1
getchar()等同于fgetc(stdin)
getc和fgetc区别是一个是宏一个是函数
注意事项:
函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!
调用getchar会阻塞,等待你的键盘输入
字符输出:
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
成功时返回写入的字符;出错时返回EOF
putchar(c)等同于fputc(c, stdout)
行输入(读取整个行):
char *gets(char *s); 读取标准输入到缓冲区s(指针指向的空间)
char *fgets(char *s, int size, FILE *stream);
读取的位置:FLIE * stream
缓冲区大小:size
成功时返回s,到文件末尾或出错时返回NULL
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’
注意事项
fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。
行输出(写整行):
int puts(const char *s);
int fputs(const char *s, FILE *stream);
成功时返回非负整数;出错时返回EOF
puts将缓冲区s中的字符串输出到stdout,并追加’\n’
fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’
对象的读和写
二进制文件和文本文件区别:存储格式的区别(文本文件只能存储文本)
二进制读写:
size_t fread(void *ptr, size_t size, size_t n, FILE *fp); //二进制文件读函数
void *ptr 读取内容放的位置指针
size_t size 读取的块大小
size_t n 读取的个数
FILE *fp 读取的文件指针
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp); 二进制文件写函数
void *ptr 写文件的内容的位置指针
size_t size 写的块大小
size_t n 写的个数
FILE *fp 要写的文件指针
注意:
文件写完之后,文件指针指向文件末尾。
标准IO:刷新流
一般读写操作,在内存中有一个缓冲流,只有当缓冲流写满时,才会写入磁盘满
刷新流可以回避这个特点,可以在缓冲流未满时写入磁盘
int fflush(FILE *fp); //流刷新函数
成功时返回0;出错时返回EOF
将流缓冲区中的数据写入实际的文件
Linux下只能刷新输出缓冲区,输入缓冲区丢弃
如果输出到屏幕使用fflush(stdout)
流的定位:
long ftell(FILE *stream);
long fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET 从距文件开头 offset 位移量为新的读写位置
SEEK_CUR:以目前的读写位置往后增加 offset 个位移量
SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量
offset参数:偏移量,可正可负
注意事项:
1.文件的打开使用a模式 fseek无效
2.rewind(fp) 相当于 fseek(fp,0,SEEK_SET);
3.这三个函数只适用2G以下的文件
格式化输出
int fprintf(FILE *stream, const char *fmt, …); //输出到文件
int sprintf(char *s, const char *fmt, …); //输出到字符串上
成功时返回输出的字符个数;出错时返回EOF
printf 则是shuchu到屏幕
格式化输入
int fscanf(FILE *stream, const char *format, ...); //输入到文件
int sscanf(const char *str, const char *format, ...); //输入到字符
文件IO
系统调用IO或者系统IO(不同的操作系统,提供的IO接口不一样)
特点:
不提供缓冲机制、每次读写操作都引起系统调用
核心概念是文件描述符fd,能够访问各类型的文件
文件IO的API
open close read write
文件描述符:
每打开的文件都对应一个文件描述符
文件描述符从0开始,依次递增
文件IO操作通过文件描述符来完成
0,1,2的含义:分别表示标准输入、标准输出、错误
标注IO预定3个流,程序运行时自动打开
Open介绍:文件IO打开
O_RDONLY 只读方式打开
O_WRONLY 可写方式打开
O_RDWR 读写方式打开
O_CREA 如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限
O_APPEND 以添加的方式打开文件,那么打开文件时先删除文件中原有数据
mode 被打开文件的存取权限,为8进制表示法
打开文件时使用两个函数
创建文件时第三个参数指定新文件的权限,真正建立文件时的权限受到umask值影响,实际权限是mode-umaks
可以打开设备文件,不能创建设备文件,创建设备文件使用mknode
权限联合使用:
O_WRONLY | O_CREAT | O_TRUNC, 0664
O_RDWR | O_CREAT | O_TRUNC, 0664
O_WRONLY | O_CREAT | O_APPEND, 0664
O_RDWR | O_CREAT | O_APPEND, 0664
umask:用于设定文件文件或者目录的初始权限
是文件和目录的真正初始权限
文件或目录的初始权限 = 文件或目录的最大默认权限-umask权限
文件的关闭
int close(int fd)
注意:
求字符串长度使用sizeof ,对二进制数据使用strlen
printf的字符最后没有“\0”
目录操作
- 打开目录
DIR *opendir(const char *name)
DIR *fdopendir(int fd) //需要使用open函数返回一个文件描述符
DIR是用来描述一个打开的目录文件的结构体类型,成功返回目录流指针,出错返回NULL
- 读取目录
Struct dirent *readdir(DIR *dirp);
struct dirent是用来描述目录流中一个目录项的结构体类型
成功时返回目录流dirp中下一个目录项;出错或到末尾时时返回NULL
3) 关闭目录
int closedir(DIR *dirp);
修改文件权限(查看权限用ll)
Chmod、fchmod函数用来修改文件的访问权限
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
获取文件属性
int stat(const char *path, struct stat *buf); //
int lstat(const char *path, struct stat *buf); //获取的是链接文件的属性
int fstat(int fd, struct stat *buf);
成功时返回0;出错时返回EOF
如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性
Stat结构体
库的概念
创建静态库的步骤:
- 编写库文件代码,编译为.o目标文件
- 用ar命令创建libxxx.a文件
ar -rsv libxxxx.a xxxx.o
静态库文件要以lib开头,后缀名为.a
没有main函数的.c文件不能生成可执行文件
链接静态库:
gcc –o 目标文件 源码.c –L 路径 -l XXX
-L表示库所在的路径
-I 后面跟库的名称
动态库的生成步骤:
- 生成与位置无关的目标文件
gcc –c –fPIC xxx.c xxxxx.c …
2) 生成动态库
gcc -shared -o libxxx.so xxx.o xxxxx.o
- 编译可执行文件
gcc –o 目标文件 源码.c –L 路径 –lxxx
为了让系统能够找到加载的共享库,有三种方法:
- 把库拷贝到/usr/lib和/lib目录下
- 在LD_LIBRARY_PATH环境变量中添加库所在路径
- 添加/etc/ld.so/conf.d/*.conf文件, 执行ldconfig刷新
查看可执行文件使用的动态库
Lld命令:ldd 可执行文件