标准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
关注我的公众号,共同交流学习嵌入式开发相关技术: