Linux标准I/O编程

标准IO编程

标准IO的核心对象就是流(FILE结构体)

1. 流的打开
函数原型:FILE *fopen(const char *path,const char *mode)
函数参数:path 要打开的文件路径及文件名
		 mode 文件打开方式
函数返回值:成功---指向FILE指针;失败---NULL
mode值取值说明
r打开只读文件,该文件必须存在
r+打开可读写文件,该文件必须存在
w打开只写文件,若文件存在擦除内容;若不存在建立文件
w+打开可读写文件,若文件存在擦除内容;若不存在建立文件
a打开只写文件,若文件存在写入的数据会被加到文件尾;若不存在建立文件
a+打开可读写文件,若文件存在写入的数据会被加到文件尾;若不存在建立文件

当用户程序运行时,系统自动打开3个流:stdin、stdout、stderr

2. 流的关闭
函数原型:int *fclose(FILE *stream)
函数参数:stream 已打开的流指针
函数返回值:成功---0;失败---EOF

程序结束时会自动关闭所有打开的流

3. 错误处理
3.1 perror()函数
函数原型:void *perror(const char * s)
函数参数:s 在标准错误流上输出的信息
函数返回值:无

示例代码:

#include <stdio.h>

int main()
{
   FILE *fp;
   if((fp = fopen("test.txt","r")) == NULL){
   	perror("fail to fopen");
   	return -1;
   }	
   fclose(fp);
   return 0;
}

如果文件不存在,程序执行时会打印如下信息:

fail to fopen: No such file or diectory
3.2 strerror()函数
函数原型:char *strerror(int errnum)
函数参数:errnum 错误码
函数返回值:错误码对应的错误信息

示例代码:

#include <stdio.h>

int main()
{
   FILE *fp;
   if((fp = fopen("test.txt","r")) == NULL){
   	printf("fail to fopen: %s\n", strerror(errno));
   	return -1;
   }	
   fclose(fp);
   return 0;
}

如果文件不存在,程序执行时会打印如下信息:

fail to fopen: No such file or diectory
4. 流的读写
4.1 按字符(字节)输入/输出
函数原型:int getc(FILE *stream)		//
		 int fgetc(FILE *stream)	//
		 int getchar(void)			//从stdin中读取一个字符
函数参数:stream 要输入的文件流
函数返回值:成功---读取的字符;失败---EOF

函数原型:int putc(int c, FILE *stream)		//向指定的流输出一个字符
		 int fputc(int c, FILE *stream)		//
		 int putchar(int c)					//从stdout输出一个字符
函数参数:c 输出的字符
   		 stream 指定的文件流
函数返回值:成功---输出的字符;失败---EOF
4.2 按行输入/输出
函数原型:char * gets(char *s)		//容易造成缓冲区溢出,不建议使用
		 char * fgets(char *s, int size, FILE *stream)	//从指定的流中读取一个字符串,当遇到\n时,会读取\n或读取size-1个字符后返回
函数参数:s 存放输入字符串的缓冲区首地址
   		 size 输入的字符串长度
   		 stream 对应的流
函数返回值:成功---s;失败---NULL

函数原型:int puts(const char *s)		//
		 int fputs(const char *s, FILE *stream)		//
函数参数:s 存放输出字符串的缓冲区首地址
   		 stream 对应的流
函数返回值:成功---s;失败---NULL
4.3 以指定大小为单位读写文件
在文件流被打开之后,对文件流按指定大小为单位进行读写操作
函数原型:size_t  fread(void *ptr, size_t size, size_t nmemb, FILE * stream)
函数参数:ptr 存放读入记录的缓冲区
   		 size 读取的每个记录的大小
   		 nmemb 读取的记录数
   		 stream 要读取的文件流
函数返回值:成功---返回实际读到的nmemb数目;失败---EOF

函数原型:size_t  fwrite(void *ptr, size_t size, size_t nmemb, FILE * stream)
函数参数:ptr 存放写入记录的缓冲区
   		 size 写入的每个记录的大小
   		 nmemb 写入的记录数
   		 stream 要写入的文件流
函数返回值:成功---返回实际写入的nmemb数目;失败---EOF
5. 流的定位

每个打开的流内部都有一个当前读写位置。流在打开时,当前读写位置为0,表示文件的开始位置。每读写一次后,当前读写位置自动增加实际读写的大小。在读写流之前可先对流进行定位,即移动到指定的位置再操作。

函数原型:int fseek(FILE * stream, long offset, int whence)
函数参数:stream 要定位的文件流
  		 offset 相对于基准值的偏移量
  		 whence 基准值  
  		        -->SEEK_SET 代表文件起始位置
  				-->SEEK_END 代表文件结束位置
  				-->SEEK_CUR 代表文件当前读写位置
函数返回值:成功---0;失败---EOF

函数原型:long ftell(FILE * stream)
函数参数:stream 要定位的文件流
函数返回值:成功---返回当前读写位置;失败---EOF
6. 格式化输入/输出

格式化输入输出函数可以指定输入输出的具体格式

函数原型:int scanf(const char *format, ...)
 		 int fscanf(FILE *fp, const char *format, ...)
 		 int sscanf(char *buf, const char *format, ...)
函数参数:format 输入的格式
 		 fp 作为输入的流
 		 buf 作为输入的缓冲区  
函数返回值:成功---输出字符数;失败---EOF

函数原型:int printf(const char *format, ...)
 		 int fprintf(FILE *fp, const char *format, ...)
 		 int sprintf(char *buf, const char *format, ...)
函数参数:format 输出的格式
 		 fp 接收输出的流
 		 buf 接收输出的缓冲区  
函数返回值:成功---输出字符数;失败---EOF

关注我的公众号,共同交流学习嵌入式开发相关技术:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安迪西嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值