标准IO常用到的函数
1.打开文件:使用fopen()函数打开文件。
2.关闭文件:使用fclose()函数关闭文件。
3.读取文件:使用fread()、 fgets()、fscanf()等函数读取文件。
4.写入文件:使用fwrite() 、 fprintf() 、fputc()等函数写入文件。
5.定位文件位置:使用fseek()函数移动文件位置指针。
6.检查文件状态:使用feof()、ferror()等函数检查文件状态。
fopen函数:
函数原型:
FILE *fopen(const char *pathname, const char *mode);
参数说明:
文件模式是在打开文件时指定的也就是
“r”:只读模式,文件必须存在。
“w”:写入模式,如果文件不存在则创建新文件,如果存在则覆盖原有文件。
“a”:追加模式,如果文件不存在则创建新文件,在文件末尾追加数据。“r+”、“w+”、“a+”:读写模式,允许读取和追加读写。
“rb”、“wb”、“ab”:二进制模式,与上述模式类似,用于处理二进制文件与字。(Linux中忽略)
返回值
成功返回文件流指针, 失败返回 NULL, errno 会被设置
fclose
函数原型
int fclose(FILE *stream);
用来关闭打开的文件
fwrite函数
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
通过文件流指针往文件中写入数据, 以块为单位
参数说明:
Ptr: 写入的内容的内存地址
Size: 每一块数据的大小
Nmemb: 有多少块数据
Stream: 写入哪个文件的文件流指针
返回值:
成功则返回写入多少块数据(一定是你要求写入多少块, 他就返回多少块), 如果
返回值不等于要求写入的块数, 证明写入失败, 写入失败可以用 ferror 来判断
fread:
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数说明:
Ptr: 读取到的内容存放的内存地址
Size: 每一块数据的大小
Nmemb: 有多少块数据
Stream: 读取哪个文件的文件流指针
返回值:
成功则返回读取多少块数据, 如果返回值不等于要求读取的块数, 证明要么写入失败, 要么则读到文件的末尾, 读取失败可以用 ferror 来判断, 读取到文件的末尾可以用 feof来判断。
注意
如果读取到末尾, 末尾的数据不足一块数据的大小的时候, 它是有把他读取出来的, 只是返回值不会这个读取出来的内容当做是一块数据, 会把他计算成为 0 块数据
feof
函数原型:
int feof(FILE *stream);//查看文件是否在末尾
返回值:
如果文件结束,则返回非0值,否则返回0
ferror
函数原型:
int ferror(FILE *stream);/用来检查参数 stream 所指定的文件流是否发生了错误情况,
返回值:
没有错误发生返回0值
如果文件流有错误发生则返回非0值.
fflush
如上图所示主要用于刷新缓冲区,当调用fflush时从缓冲区存到硬盘中
函数原型:
int fflush(FILE *stream)
返回值:
如果成功刷新缓冲区,
fflush()
返回 0。如果发生错误,返回
EOF
,并且设置错误标识符(ferror
)。
get系列
函数原型
#include <stdio.h>
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);
函数说明
fgetc:从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
getchar :从键盘获取一个字符 fgetc(stdin) == getchar();
fgets:获取一行,遇到换行符停止
ungetc:将字符扔到缓冲区 int ungetc(int char, FILE *stream)
注意
fgets() 和 gets() 都是按行读取文件数据,他们的区别是:
- fgets() 可以读取指定的任意文件,而 gets() 只能从键盘读取。
- fgets() 有内存边界判断,而 gets() 没有,因此后者是不安全的,不建议使用。
- fgets() 在任何情形下都按原样读取数据,但 gets() 会自动去除数据末尾的 ‘\n’
put系列
函数原型
#include <stdio.h>
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);
注意
fputs() 和 puts() 都是按行将数据写入文件,他们的区别是:
- fputs() 可以将数据写入指定的任意文件,而 puts() 只能将数据输出到屏幕。
- fputs() 在任何情形下都按原样写入数据,但 puts() 会自动给写入数据的末尾加上 ‘\n’
printf系列
fprintf:打印到文件中
fdprintf:打印到文件描述符中
sprintf:打印到数组中(指定的内存)
安全版本:snprintf->可以指定长度,指定最大长度
scanf系列(空格和\n是数据的分割符号)
fscanf:从文件中格式化获取对应的数据,可以进行格式转化
sscanf:从一块内存中格式化获取数据
文件操作的注意事项
1.错误处理:在打开文件时,应该检查返回的文件指针是否为NULL ,这表明文件打开失败。
2.资源管理:在完成文件操作后,务必使用fclose() 函数关闭文件,以释放资源。
3.缓冲区管理:文件操作通常涉及缓冲区,因此在关闭文件之前,系统会自动刷新缓冲区以确保所有数据都被写入磁盘。
4.文件路径:在不同的操作系统上,文件路径可能有所不同,注意跨平台兼容性。