Linux学习(十五):标准IO

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;
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值