时刻记住一句话:Linux下一切皆文件,不管什么都是一个文件
1.系统IO和标准IO
文件操作一般分为两种:
1、系统IO:系统调用接口,open(), read(), write(), close()。是操作系统直接提供的编程接口(API)。
2、标准IO:标准库的I/O函数,fopen(), fread(), fwrite(), fclose(),是对系统调用接口进一步封装。
3、系统IO和标准IO有什么区别?
系统IO : 低级IO,没有缓冲机制。操作的对象是文件描述符
标准IO : 高级IO,有缓冲机制,标准C库中实现。操作的对象是文件流
系统开机的时候他就存在的文件
stdin 标准输入
stdout 标准输出
stderr 标准出错
2.系统I/O函数
2.1 函数打开:open
函数的功能:打开一个文件
函数头文件:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数的原型:int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函数的参数:
pathname:
文件的路径
flags :
O_RDONLY 读
O_WRONLY 写
O_RDWR 读写
O_CREAT 没有就创建 有就访问
O_TRUNC 将文件截取为0
O_APPEND:追加
mode(可选):
权限码就是 0664 0775
函数返回值:
成功返回文件的句柄(int)
失败 -1
2.2 函数关闭:close
函数的功能:关闭一个文件(低级IO)
函数头文件:
#include <unistd.h>
函数的原型:int close(int fd);
函数的参数:
fd :文件的描述符
函数的返回值:
0 成功
-1 失败
2.3 写函数:write
函数的功能:写数据到文件里面
函数头文件:#include <unistd.h>
函数的原型:
ssize_t write(int fd, const void *buf, size_t count);
函数的参数:
fd : 就是文件的句柄
buf: 就是你要写入的内容缓冲区
count:写入的字节数
函数返回值:
返回成功写入的字节数
返回 -1 失败
2.4 读函数:read
函数的功能:读数据
函数头文件:#include <unistd.h>
函数的原型:
ssize_t read(int fd, void *buf, size_t count);
函数的参数:
fd : 就是文件的句柄
buf: 就是读出保存内容缓冲区
count:读出的字节数
函数返回值:
返回成功读出的字节数
3.标准IO函数
3.1 函数打开:fopen
函数的功能:打开一个文件
函数头文件:stdio.h
函数的原型:FILE *fopen(const char *path, const char *mode);
函数的参数:
path:
要打开的文件的路径(绝对、相对)
mode:
r:
以只读的形式打开文件
读写指针在开头
r+:
以读写的形式打开文件
读写指针在开头
w:
以只写的形式打开该文件
且清除文件的全部内容
文件不存在就创建
文件读写指针在开头
w+
以可读可写的形式打开该文件
且清除文件的全部内容
文件不存在就创建
文件读写指针在开头
a
以只写的形式打开该文件
文件读写指针在末尾
文件不存就创建
a+
以读写的形式打开文件
文件不存就创建
读文件就在开头
写文件总是在末尾
函数返回值:
成功返回 文件指针 FILE * 类型的
失败返回 NULL
3.2 函数关闭:fclose
函数的功能:关闭打开的文件
函数头文件:stdio.h
函数的原型:int fclose(FILE *stream);
函数的参数:
FILE *stream
就是打开文件返回的文件句柄
函数返回值:
返回 0 成功
返回 -1 失败
3.3 标准的文件写:fwrite
函数的功能:写入一个缓冲区给文件
函数头文件:stdio.h
函数的原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数的参数:
ptr:你需要写入的缓冲区(内容)
size:你一次写入多少个字节
nmemb:你要写入几次
stream:文件句柄
函数返回值:
返回你成功写入的次数
3.4 标准的文件写:fread
函数的功能:从文件中读取一片内容
函数头文件:stdio.h
函数的原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数的参数:
ptr:传入一个空间
size:一次读取的内容的大小
nmemb:你要读几次
stream:文件句柄
函数返回值:
size_t :读取的次数
3.5 函数写入字符串:fputs
函数的功能:往文件输入/写入字符串
函数头文件:stdio.h
函数的原型:int fputs(char * str, FILE *stream);
函数的参数:
int c 就是你要写入的字符
FILE *stream :就是文件句柄
函数返回值:
如果写入成功 返回字符本身
写入失败 返回 EOF(-1)
3.6 函数写入字符串:fgets
函数头文件:stdio.h
函数的原型:char *fgets(char *s, int size, FILE *stream);
函数的参数:
s : 就是你读取的缓存区
size :读取的长度
stream :文件句柄
函数返回值:
函数成功:返回读取的首地址
失败返回NULL
3.7 移动文件流的读写位置:fseek
函数头文件:stdio.h
函数的原型:int fseek(FILE * stream,long offset,int whence);
函数的参数:
stream :文件句柄
offset : 为根据参数 whence 来移动读写位置的位移数
whence:
SEEK_SET: 从距文件开头 offset 位移量为新的读写位置
SEEK_CUR: 以目前的读写位置往后增加 offset 个位移量
SEEK_END :将读写位置指向文件尾后再增加 offset 个位移量
函数返回值:
调用成功时则返回 0
若有错误则返回-1
注意:
1.必须使用 ftell()来取得目前读写的位置。
2.当 whence 值为 SEEK_CUR 或 SEEK_END 时,参数 offset 允许负值的出现
4. 常用的一些函数
4.1 perror(打印出错误原因信息字符串)
函数头文件:stdio.h
函数的原型:void perror(const char *s);
函数的作用:perror()用来将上一个函数发生错误的原因输出到标准错误
函数的参数:
参数 s 所指的字符串会先打印出,后面再加上错误原因字符串
函数返回值:
无
4.2 feof(检查文件流是否读到了文件尾)
函数头文件:stdio.h
函数的原型:int feof(FILE * stream);
函数的作用:feof()用来侦测是否读取到了文件尾
函数的参数:
stream 为 fopen()所返回之文件指针。如果已到文件尾则返回非零值,
其他情况返回 0
函数返回值:
返回非零值代表已到达文件尾。
4.3 putchar(将指定的字符写到标准输出设备)
函数头文件:stdio.h
函数的原型:int putchar (int c);
函数的作用:putchar()用来将参数 c 字符写到标准输出设备。
函数返回值:
返回成功输出c
返回失败输出EOF
附加说明:putchar()非真正函数,而是 putc(c,stdout)宏定义。
4.4 fscanf(格式化字符串输入)
函数头文件:stdio.h
函数的原型:int fscanf(FILE * stream ,const char *format,....);
函数的作用:
函数会自参数 stream的文件流中读取字符串, 再根据参数 format字符
串来转换并格式化数据。
函数返回值:
成功则返回参数数目
失败则返回-1