1、Linux标准I/O概述
1.1 标准I/O的由来
标准I/O指的是ANSI C中定义的用于I/O操作的一系列函数。只要操作系统中安装了C库,标准I/O函数就可以调用。换句话说,如果程序中使用的是标准I/O函数,那么源代码不需要修改就可以在其他操作系统下编译运行,具有更好的可移植性。
1.2 流的含义
标准I/O的核心对象就是流。当用标准I/O打开一个文件时,就会创建一个FILE结构体描述该文件。我们把FILE结构体形象的称为流。
标准I/O中的流的缓冲类型有以下三种:
(1)全缓冲:对于文件操作采用的缓冲区。
缓冲大小:4K
刷新缓存:1、程序正常结束 2、缓存区满 3、使用fflush函数
(2)行缓冲:对于终端操作使用的缓冲区
缓冲大小:1K
刷新缓存:1、程序正常结束 2、 缓存区满 3、使用fflush函数 4、'\n'
(3)无缓冲:对于终端采用的缓冲区,例如标准出错(stderr)
2、标准I/O编程
2.1、流的打开
函数原型:FILE *fopen(const char *path,const char *mode);
参数:
path:包含要打开的文件路径以及文件名
mode:打开方式
返回值:成功返回FILE指针,失败返回NULL
打开方式mode有以下几种:
r 打开只读文件,文件必须存在。
w 打开只写文件,文件不存在会先创建,文件若存在会先清空文件内容
r+ 打开可读写的文件,文件必须存在,不会自动创建,写内容会先覆盖之前存在的数据
w+ 读写模式,文件不存在会先创建,文件若存在会先清空文件内容。
a 只写模式,文件不存在会先创建,文件若存在新内容向旧数据之后添加,a代表append
a+ 读写模式,文件不存在会先创建,文件若存在新内容向旧数据之后添加
当前用户运行时,系统自动打开三个流,标准输入流stdin,标准输出流stdout和标准错误流stderr。
2.2 流的关闭
函数原型:int fclose(FILE *stream)
参数:stream 已经打开的流
返回值:成功返回0,失败返回EOF
程序结束时会自动关闭所有打开的流
2.3 流的读写
2.3.1 按照字符读
函数原型: int fgetc(FILE *stream)
参数:stream 已经打开的流
返回值:成功返回读取的字符,失败返回EOF
2.3.2 按照字符写
函数原型: int fputc(FILE *stream)
参数:stream 已经打开的流
返回值:成功返回输出的字符,失败返回EOF
2.3.3 按照行读
函数原型: char * fgets(char *s,int size FILE * stream)
参数:
s:存放字符串的首地址
size:读取的长度,注意实际获取的长度为size-1,最后一个默认添加'\0'
stream:打开的流
返回值:成功返回s,失败或到达文件末尾返回NULL
注意:fgets在两种情况下返回,1、换行符'\n';2、读取了size-1个字符
2.3.4 按照行写
函数原型: int fputs(const char *s,FILE *stream)
参数:
s:存放字符串的首地址
stream:打开的流
返回值:成功返回s,错误返回NULL
2.3.5 指定大小读
函数原型:size_t fread(void *ptr,size_t size size_t nmemb,FILE *stream)
参数:
ptr:存储读取数据的地址
size:读取的每个记录的大小
nmemb:读取的记录数
steam:要读取的文件流
返回值:成功返回实际读取到的nmemb数目,到达文件末尾EOF返回0
2.3.6 指定大小写
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr:数据的地址
size:写入的每个记录的大小
nmemb:写入的记录数
steam:要写入的文件流
返回值:成功返回实际读取到的nmemb数目,失败返回EOF
2.3.7 流的定位
函数原型:int fseek(FILE *stream,long offset,int whence);
参数:
steam:要定位的文件流
offset:相对于基准值的偏移量
whence 基准值 1、SEEK_SET 代表文件的起始位置
2、SEET_CUR 代表文件当前位置
3、SEEK_END 文件结束位置,注意流结束时,结束位置是在最后一个字符的下一个位置
例程:拷贝一个文件内容到另一个文件中
#include <stdio.h>
#if 0
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
#endif
int main(int argc, const char *argv[])
{
FILE *fp_r = NULL, *fp_w = NULL;
if((fp_r = fopen(argv[1], "r")) == NULL )
{
printf("fp_r fopen error\n");
return -1;
}
if((fp_w = fopen(argv[2], "w")) == NULL )
{
printf("fp_w fopen error\n");
return -1;
}
char buf[32];
int ret = 0;
while(ret = fread(buf, 1, sizeof(buf), fp_r)) //读到文件末尾,返回0
{
fwrite(buf, 1, ret, fp_w);
}
fclose(fp_r);
fclose(fp_w);
return 0;
}