一、概念
在C语言库中定义一系列对文件输入输出的函数。
二、特点
1.缓冲机制
标准IO的优点就是通过缓冲机制减少系统调用的次数,提高效率,输出的数据暂存在缓冲区,缓冲区刷新或满时输出。
2.流
文件流是一种用于处理文件输入和输出的抽象概念,文件流将文件和C语言的数据处理机制连接起来,使数据的写入(输入流)和读出(输出流)更方便。
默认打开了三个流:stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
三、缓存区
1.行缓存(和终端操作相关)
缓存刷新的条件
1)程序正常退出
2)\n刷新
3)缓存区满刷新
4)fflush函数强制刷新
2.全缓存(和文件操作相关)
缓存刷新的条件:
1)程序正常退出
2)缓存区满刷新
3)强制刷新fflush
3.不缓存:标准错误 strerr
四、函数
1.打开文件
fopen
定义:
FILE *fopen(const char *path, const char *mode);
参数:
path:打开文件的路径
mode:打开文件的模式
r:只读,流被定位到文件开头
r+:可读可写,流被定位到文件开头
w:只写,文件不存在创建,文件存在清空,流被定位到文件开头
w+:可读可写,文件不存在创建,文件存在清空,流被定位到文件开头
a:追加,文件不存在创建,存在追加,流被定位到文件末尾
a+:可读可写,文件不存在创建,存在追加,开始进行读时从头读,进行写时流被定位到文件末尾
返回值:
成功:文件流
失败:NULL,并且设置errno(错误码)
2.关闭文件
fclose
定义:
int fclose(FILE* stream);
参数:
stream:文件流
3.读写文件
3.1按字符读写
fgetc
定义:
int fgetc(FILE *stream);
功能:
从文件中读一个字符
参数:
stream:文件流
返回值:
成功:读到的字符
失败或读到文件末尾:EOF(-1)
fputc
定义:
int fputc(int c, FILE * stream);
功能:
向文件中写入一个字符
参数:
c:要写的字符(以字符的ASCII码值传递)
stream:文件流
返回值:
成功:写的字符的ASCII
失败:EOF
补充:
ferror函数用于判断读文件时是否出错,返回非零值表示出错;
feof函数用于判断读文件时是否读到文件末尾,返回非零值表示读到文件末尾;
这两个函数使用时参数只需传入文件流。
示例代码:
#include <stdio.h>
int main()
{
FILE *fp = fopen("../file/text.txt", "r+");
if (fp == NULL)
{
perror("fopen error");
return -1;
}
printf("fopen success\n");
fputc('a', fp);
int ch = fgetc(fp);
if (ch == EOF)
{
if (ferror(fp))
perror("fgetc error");
if (feof(fp))
perror("end file");
return -1;
}
printf("%c\n", ch);
fclose(fp);
return 0;
}
向文件中写入了一个字符a并将它读出打印到终端,运行时发现字符被写入到文件中,但是终端并没有打印出该字符。
终端给出的错误提示是已经读到了文件末尾,这说明使用fputc进行写入时,文件中的位置标识符(相当于编辑文档时光标的位置)会自动向后移动一个字符的位置。
3.2按字符串读写
fgets
定义:
char *fgets(char *s, int size, FILE *stream);
功能:
从文件中读取一串字符
参数:
s:存放读取的字符串的首地址
size:读取的大小
stream:文件流
返回值:
成功:读取的字符串的首地址
失败或读到文件末尾:NULL
特性:
1.一次调用最多读取一行数据
2.实际读到个数为size-1个,末尾自动添加\0
fputs
定义:
int fputs(const char *s, FILE *stream);
功能:
向文件中写字符串
参数:
s:要写的内容
stream:文件流
返回值:
成功:非负整数
失败:EOF
示例代码:
#include <stdio.h>
int main()
{
FILE *fp = fopen("../file/text.txt", "r+");
if (fp == NULL)
{
perror("fopen error");
return -1;
}
printf("fopen success\n");
char str[99]="";
fputs("qwert",fp);
fgets(str, 99, fp);
printf("%s\n", str);
return 0;
}
和fputc相同,fputs在对文件进行写入结束时,位置标识符会停留在文件末尾,导致读不出数据。
3.3按二进制读写
可以读写任意类型的文件,以二进制的方式进行读写。
fread
定义:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从文件流读取多个元素
参数:
ptr:用来存放读取元素 (可以用来读取任意类型的数据)
size:元素大小 sizeof(数据类型)
nmemb:读取对象的个数
stream:要读取的文件
返回值:
成功:读取对象的个数
读到文件尾或失败:0
fwrite
定义:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
按对象写
参数:
同fread
返回值:
成功:写的元素个数
失败 :0
4.文件定位
rewind
定义:
void rewind(FILE *stream);
功能:
将文件位置标识符定位到起始位置
fseek
定义:
int fseek(FILE *stream, long offset, int whence);
功能:
文件的定位操作
参数:
stream:文件流
offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移
whence:相对位置:
SEEK_SET:相对于文件开头
SEEK_CUR:相对于文件当前位置
SEEK_END:相对于文件末尾
返回值:
成功:0
失败:-1
注:当打开文件的方式为a或a+时,fseek不起作用
ftell
定义:
long ftell(FILE *stream);
功能:
获取位置指针当前的文件位置
参数:
要检测的文件流
返回值:
成功:当前的文件位置
出错:-1
如图,加上rewind语句将文件中的位置标识符定位到文件开头后便可打印出。