-
- 系统I/O
- open
- 函数原型
- int open(const char *pathname,int flags);
- int open(const char *pathname,int flags,mode_t mode);
- 作用
- 打开一个指定文件并获得文件描述符
- 头文件
- <sys/types.h>
- <sys/stat.h>
- <fcntl.h>
- 参数
- pathname
- 即将要打开的文件
- flags
- O_RDWR:读写方式打开文件
- O_WRONLY:只写方式打开文件
- O_RDONLY:只读方式打开文件
- O_CREAT:如果文件不存在,则创建该文件
- O_EXCL:如果使用O_CREAT选项且文件存在,则返回错误信息
- O_NOCTTY:当文件为终端时,阻止该终端成为进程的控制终端
- O_TRUNC:若文件已存在,则删除文件中原有数据
- O_APPEND:以追加方式打开文件,需配合写模式方可追加文件
- mode
- 如果文件被新建,指定其权限为mode(八进制表示法)
- pathname
- 返回值
- 成功:返回大于等于0的整数(文件描述符)
- 失败:返回-1
- 注意事项
- O_CREATE:文件不存在创建,如果该文件已经存在则默认打开,如果你写成 O_CREATE | O_EXCL那么文件如果存在则会报错打开失败。 一般使用O_CREATE,open需要多填一个形参,文件的权限。
- O_APPEND:打开文件的时候,他自内部调用了lseek(fd,0,SEEK_END);直接把读写位置设置到文件数据的末尾形成追加模式。
- open返回值--文件描述符的继承或迭代
- 同一个文件只open不close只能open1024次
- 默认的情况下,提供的文件路径是错的,那么会打开文件失败,或者你提供的文件是不存在的,也会打开失败 如果使用了O_CREAT的话,文件不存在会创建的
- 图示
- 函数原型
- read
- 函数原型
- ssize_t read(int fd, void *buf, size_t count);
- 作用
- 读取文件
- 头文件
- <unistd.h>
- 参数
- fd :文件描述符
- buf:用来存储读出数据的指针
- count :为要读出的字节数
- 返回值
- 成功:返回读到的字节数或0,若达到文件尾则返回0,因为读到的字节数可能小于count的值
- 失败:返回-1
- 注意事项
- 函数原型
- write
- 函数原型
- ssize_t write(int fd , const void *buf ,size_t count);
- 作用
- 写数据进文件
- 头文件
- <unistd.h>
- 参数
- fd:文件描述符
- buf :存放你要写入的数据的指针变量
- count :要写入文件中的数据的字节大小
- 返回值
- 成功:返回写入文件的数据的实际大小
- 失败:返回-1
- 注意事项
- 函数原型
- lseek
- 函数原型
- off_t lseek(int fd, off_t offset , int whence);
- 作用
- 控制文件的读写位置
- 头文件
- <unistd.h>
- 参数
- offset :偏移量,负数:反方向偏移;如果是以文件末尾位参照物偏移,不会受到文件大小的影响,也会偏移过去的。
- whence:从哪里开始偏移
- SEEK_SET 从文件头偏移
- SEEK_CUR 从当前的读写位置偏移
- SEEK_END 从文件末尾开始偏移
- 返回值
- 成功:返回文件当前读写位置
- 失败:返回-1
- 注意事项
- 函数原型
- close
- 函数原型
- int close(int fd);
- 作用
- 关闭文件
- 头文件
- <unistd.h>
- 参数
- fd:要关闭文件的文件描述符
- 返回值
- 成功:返回0
- 失败:返回-1
- 注意事项
- close函数你帮你关闭文件并且释放文件在内存中的资源,打开open几次文件就得close关闭几次文件,close关闭文件成功后,文件的描述符会发释放掉的
- 函数原型
- open
- 🖍标准I/O
- fopen
- 函数原型
- FILE * fopen (const char *path,const char *mode);
- 作用
- 打开指定文件
- 头文件
- <stdio.h>
- 参数
- path:要打开文件的路径
- mode
- "r"或"rb" :以只读方式打开文件,要求文件必须存在
- "r"+或"r+b":以读写方式打开文件,要求文件必须存在
- "w"或"wb" :以只写方式打开文件,文件如果不存在将会创建新文件;如果存在将会将其内容清空
- "w+"或"w+b" :以读写方式打开文件,文件如果不存在将会创建新文件;如果存在将会将其内容清空
- "a"或"ab":以只写方式打开文件,文件如果不存在将会创建新文件;如果存在,文件位置偏移量被自动定位到文件末尾(即以追加方式写数据)
- "a+"或"a+b":以读写方式打开文件,文件如果不存在将会创建新文件;如果存在,文件位置偏移量被自动定位到文件末尾(即以追加方式写数据)
- 返回值
- 成功:返回指向FILE的指针
- 失败: 返回NULL
- 图示
- 函数原型
- fclose
- 函数原型
- int fclose(FILE *stream);
- 作用
- 关闭流
- 头文件
- <stdio.h>
- 参数
- stream:已打开的流指针
- 返回值
- 成功:返回0
- 失败:返回EOF
- 函数原型
- perror
- 函数原型
- void perror(const char*s);
- 作用
- 错误处理,打印错误信息
- 头文件
- <stdio.h>
- 参数
- s:在标准错误流上输出的信息
- 返回值
- 无
- 函数原型
- getc和fgetc和getchar
- 函数原型
- int getc(FILE *stream);
- int fgetc(FILE *stream);
- int getchar(void);
- 作用
- 获取指定文件的一个字符
- 头文件
- <stdio.h>
- 参数
- stream:文件流指针
- 返回值
- 成功:返回读取到的字符
- 失败:返回EOF
- 图示
- 函数原型
- putc和fputc和putchar
- 函数原型
- int fputc(int c, FILE *stream);
- int putc(int c , FILE * stream);
- int putchar(int c);
- 作用
- 将一个字符写入一个指定的文件
- 头文件
- <stdio.h>
- 参数
- c:要写入的字符
- stream:要写入到的文件流指针
- 返回值
- 成功:返回写入到的字符
- 失败:EOF
- 图示
- 函数原型
- gets和fgets
- 函数原型
- char *fgets(char *s ,int size , FILE *stream);
- char *gets(char *s);
- 作用
- 从指定文件读取最多一行数据
- 头文件
- <stdio.h>
- 参数
- s:存放读取到的字符串的指针
- size:s的大小
- stream:要读取的文件流指针
- 返回值
- 成功:返回s
- 失败:返回NULL
- 图示
- 注意事项
- fgets() 和 gets() 一样,最后的换行符都会从缓冲区中取出来。只不过 gets() 是取出来丢掉,而 fgets() 是取出来自己留着
- fget() 函数中的 size 如果小于字符串的长度,那么字符串将会被截取;如果 size 大于字符串的长度则多余的部分系统会自动用 '\0' 填充。所以假如你定义的字符数组长度为 n,那么 fgets() 中的 size 就指定为 n–1,留一个给 '\0' 就行了。
- 如果输入的字符串长度没有超过 n–1,那么系统会将最后输入的换行符 '\n' 保存进来,保存的位置是紧跟输入的字符,然后剩余的空间都用 '\0' 填充
- 函数原型
- puts和fputs
- 函数原型
- int fputs(const char *s, FILE *stream);
- int puts(const char *s);
- 作用:向指定的文件写入一个字符串
- 头文件
- <stdio.h>
- 参数
- s:要写入的字符串
- stream:要写入到的文件流指针
- 返回值
- 成功:返回非负整数
- 失败:返回EOF
- 注意事项
- 使用 puts() 时,系统会在自动在其后添加换行符;而使用 fputs() 时,系统不会自动添加换行符
- 使用 fputs() 需不需要后面添加一句“printf("\n");看情况,如果输入时使用的是 gets(),那么就要添加 printf 换行;但如果输入时用的是 fgets(),则不需要。
- 因为使用 gets() 时,gets() 会将回车读取出来并丢弃,所以换行符不会像 scanf 那样被保留在缓冲区,也不会被 gets() 存储;而使用 fgets() 时,换行符会被 fgets() 读出来并存储在字符数组的最后,这样当这个字符数组被输出时换行符就会被输出并自动换行。但是也有例外,比如使用 fgets() 时指定了读取的长度,如只读取 5 个字符,事实上它只能存储 4 个字符,因为最后还要留一个空间给 '\0',而你却从键盘输入了多于 4 个字符,那么此时“敲”回车后换行符就不会被 fgets() 存储。数据都没有地方存放,哪有地方存放换行符呢!此时因为 fgets() 没有存储换行符,所以就不会换行了。
- 函数原型
- fread
- 函数原型
- size_t fread(void *ptr , size_t size , size_t nmemb, FILE *stream);
- 作用
- 从指定文件读取若干个数据块
- 头文件
- <stdio.h>
- 参数
- ptr:读取出来的数据存储的指针
- size:数据块的大小
- nmemb:数据块的个数
- stream:文件流指针
- 相当于每次读取文件中多少数据(数据块大小),读取多少次(数据块的个数)
- 返回值
- 成功:返回读取的数据块个数,等于nmemb
- 失败:读取的数据块个数,小于nmemb或等于0
- 当返回小于nmemb的数时,文件stream可能已达末尾或遇到错误
- 图示
- 函数原型
- fwrite
- 函数原型
- size_t fwrite(const void *ptr ,size_t size , size_t nmemb , FILE *stream);
- 作用
- 将若干块数据写入指定的文件
- 头文件
- <stdio.h>
- 参数
- ptr:存储要写于文件的数据的指针
- size:数据块大小
- nmemb:数据块个数
- stream:文件流指针
- 返回值
- 成功:写入的数据块的个数,等于nmemb
- 失败:返回小于nmemb或等于0
- 返回小于nmemb的值说明要写入的数据块数量不足
- 图示
- 注意
- 写入的字节数小于nm,会找垃圾数凑够nm个字节写入到文件中
- 函数原型
- fseek
- 函数原型
- int fseek(FILE *stream , long offset , int whence)
- 作用
- 移动到文件指定位置
- 头文件
- <stdio.h>
- 参数
- stream:文件流指针
- offset:相对于基准值的偏移量
- whence:基准值
- SEEK_SET 代表文件起始位置
- SEEK_END 代表文件结束位置
- SEEK_CUR 代表文件当前读写位置
- 返回值
- 成功:返回0
- 失败:返回EOF
- 函数原型
- ftell
- 函数原型
- int ftell(FILE * stream)
- 作用
- 得到文件位置指针当前位置相对于文件首的偏移字节数
- 头文件
- <strdio.h>
- 参数
- stream:文件流指针
- 返回值
- 成功:返回当前读写位置
- 失败:返回EOF
- 函数原型
- fopen
- 系统I/O
- 🗞笔记总结
- 注意点
- fgetc和getc的用法和作用几乎一样,只是getc用于标准输入,fgetc专用于文件输入,但对标准输入文件操作与getc就一样了,后续等同
- 有不对的地方欢迎指出
Linux文件io编程
于 2023-05-10 23:43:56 首次发布