C语言中的标准I/O
C语言程序运行时会自动打开三个文件
- stdin //标准输入流
- stdout //标准输出流
- stderr //标准错误输出流
C语言的文件操作基于文件指针(FILE *)
用fopen创建一个文件指针
FILE *fopen(const char *path, const char *mode);
功能:创建一个文件指针
参数:
path : 文件路径 mode : 打开方式
返回值:返回一个文件指针
mode取值:
w :将文件长度截断为零,或者创建文本文件,用于写。流被定位于文件的开始。
w+ :打开文件,用于读写。如果文件不存在就创建它,否则将截断它。流被定位于文件的开始。
r :打开文本文件,用于读。流被定位于文件的开始。
r+ :打开文本文件,用于读写。流被定位于文件的开始。
a :打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾。
a+ :打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。读文件的初始位置是文件的开始,但是输出总是被追加到文件的末尾。
总结 :带加号的都是可读可写,r只读不能创建文件,w只写并且会清空原有文件,a追加写入
r+可读可写,不能创建文件,读写流定位都在头,w+打开并清空文件,如果文件不存在则创建,读写流定位都在头
a+可读可写,文件不存在就创建文件,打开文件后写入流定位在末尾,读取流定位在头
// 以只读的方式打开文件
FILE *fp = fopen("./test.txt", "r");
对文件读取的方式
fgetc(按字符读取)
int fgetc(FILE *stream);
参数 stream:文件指针
功能 从流中读取下一个字符,并将其作为无符号char类型转换为整型
返回值 无符号char类型转换为整型返回, 在文件结束或错误结束时返回EOF
fgets(按行读取)
char *fgets(char *s, int size, FILE *stream);
参数 s:要填充的字符串首地址 size:要读取的字符个数 stream:文件指针
功能 从流中最多读入一个小于size的字符,并将它们存储到s所指向的缓冲区中。读在EOF或换行符之后停止。如果一个换行符被读取,它将被存储到缓冲区中。结束空字节('\0')存储在缓冲区的最后一个字符之后。
返回值 成功时返回s,错误时返回NULL,文件结束或者没有读到任何字符时返回NULL。
对文件的写入方式
fputc(按字符写入)
int fputc(int c, FILE *stream);
参数 c:要写入文件的字符 stream:文件指针
功能 将字符串s写入流,而不终止空字节('\0')。
返回值 无符号char类型的字符,转换为int返回; 如果出现错误,返回EOF。
fputs(按行写入)
int fputs(const char *s, FILE *stream);
参数 s:要写入的字符串 stream:文件指针
功能 无符号char类型字符,转换为int返回;如果出现错误,返回EOF。
返回值 成功时返回一个非负数,错误时返回EOF。
#include <stdio.h>
int main(int argc, char const *argv[]) {
// 以读写的方式打开一个空文件
FILE *fp = fopen("./test.txt", "w+");
//将字符h写入文件
fputc('h', fp);
//写入字符串
fputs("ello would\nnihao beijing", fp);
//释放文件
fclose(fp);
/**
* text.txt中数据为
* hello would
* nihao beijing
*/
fp = NULL;
// 以只读的方式打开文件
fp = fopen("./test.txt", "r");
// 读取第一个字符
char ch = fgetc(fp);
// 读取第一行字符
char s[20];
fgets(s, sizeof(s), fp);
printf("ch = %c\ns = %s\n", ch, s);
/**
* 输出结果为
* ch = 'h'
* s = "ello would\n"
* 读取时候会将'\n'一起读入
*/
}
输出错误信息函数perror
perror(const char *s);
参数为字符串
返回值为空
功能是打印错误信息
捕获错误代码errno 打印错误信息strerror
error是一个全局变量用于存储错误信息代码
char *strerror(int errnum);
功能 根据错误代码获取错误信息
返回值 返回错误信息的字符串
参数 错误代码
文件状态函数feof() ferror()
int feof(FILE *stream);
功能:判断是否读取到文件末尾
参数:
stream:文件指针
返回值:
成功:非0,表示已经到文件末尾了
失败:0,表示没有到文件末尾
int ferror(FILE *stream);
功能:判断读函数是否执行失败
参数:
stream:文件指针
返回值:
成功:非0,读函数执行失败
失败:0,读函数执行成功