C语言标准库stdio.h中也提供了文件访问相关的函数和宏定义,方便程序中对文件进行读写。
FILE结构类型
stdio.h中定义的描述文件的结构类型,包含文件读写状态,缓冲区中字符位置,当前是否到文件末尾等信息。
打开文件
stdio.h中提供了和操作系统连接操作文件的函数fopen.
- 接收文件名和操作文件的模式
- 返回包含文件信息结构的指针
FILE * fopen(char *filename, char *mode);
- mode
- “r” 读文件模式,如果文件不存在或者文件没有读权限,则返回NULL
- “w” 写文件模式,如果文件不存在,则创建新文件;如果文件存在则覆盖原文件内容
- “a” 追加写文件模式,如果文件不存在,则创建新文件;如果文件存在则在文件中追加新内容
- “*b” 如果访问的是二进制文件,可以在上述三种模式中加b
对文件进行简单读写
- stdio.h中提供了getc和putc对文件进行读写
int getc(FILE *fp);
int putc(int c, FILE *fp);
- getc返回fp指向的输入流中的下一个字符,如果到达文件结尾返回EOF
- putc将字符c输出到fp指向的输出文件中,如果写入错误,返回EOF
- 对文件格式化读写,可以使用fscanf和fprintf
int fscanf(FILE *fp, char *format,...);
int fprintf(FILE *fp, char *format,...);
- 按行进行读写
char *fgets(char *line, int maxline, FILE *fp);
int fputs(char *line, FILE *fp);
- fgets读取fp指向的文本信息中的一行,包含换行符,放到line数组中,maxline指定一次读取的最大字符数,读取错误时返回NULL
- fputs将一个字符串写到fp指向的文本中,不需要包含换行符,发生错误返回EOF
关闭文件释放文件指针
使用fclose关闭文件,当文件不需要再使用时,释放文件指针
int fclose(FILE *);
代码示例
实现文件复制,将文件1的内容复制到文件2中
#include <stdio.h>
int copyTwo(char *text1, char *text2);
int main(int argc, char const *argv[])
{
if(copyTwo("text1.txt", "text2.txt") == 1){
printf("copy success!\n");
}else {
printf("copy failed!\n");
}
return 0;
}
int copyTwo(char *text1, char *text2){
FILE *fp1 = fopen(text1, "r"); //读文件1
FILE *fp2 = fopen(text2, "w"); //写模式打开文件2
int c;
while((c = getc(fp1)) != EOF){ //读文件1
if(putc(c, fp2) == EOF){//写文件2
fclose(fp1); //遇到写异常返回,并关闭文件释放文件指针
fclose(fp2);
return 0;
}
}
fclose(fp1); //读写结束,释放文件指针
fclose(fp2);
return 1;
}
运行结果:
copy success!
text1.txt是提前准备好的文件:
cat text1.txt //查看文件内容
abcdedffff
数字墨翰
text2.txt是复制的文件:
cat text2.txt
abcdedffff
数字墨翰
标准输入输出和错误
启动c语言程序后,操作系统会打开三个文件并返回指向这三个文件的指针供系统使用。
- stdin 标准输入FILE指针,一般指向键盘
- stdout 标准输出FILE指针,一般指向显示器
- stderr 标准错误FILE指针,一般指向显示器
如果文件读写失败,可以将错误信息打印到标准输出,标准错误中显示。
代码示例
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp = fopen("text3.txt", "r");//读一个不存在的文件
if(fp == NULL){
fprintf(stderr, "打开文件失败!\n");
}
return 0;
}