1.什么是文件
磁盘(硬盘)上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
1.1 程序文件
程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程(windows环境后缀为.exe)。
1.2数据文件
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
2.文件的打开和关闭
2.1流和标准流
2.1.1流
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。
2.1.2标准流
那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?
那是因为C语言程序在启动的时候,默认打开了3个流:
• stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
• stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出
流中。
• stderr - 标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针。
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。
2.2文件指针
FILE* pf;
该代码定义了一个指针变量pf,该指针变量指向FILE类型数据。可以使pf指向某个文件信息区,通过该文件信息区中的信息访问该文件,也就是说通过文件指针变量能够间接找到与它相关联的文件。
例如:
3.文件的打开和关闭
文件在读写之前应该先打开文件,在结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSI C规定使用 fopen函数 来打开文件,fclose函数 来关闭文件。
//打开文件
FILE* fopen(const char* filename, const char* mode);
//关闭文件
int fclose(FILE * stream);
3.1 //fopen函数
3.2 //fclose函数
代码1://以"r"模式打开
int main()
{
//打开文件,以读的形式打开
FILE* pf = fopen("test.txt", "r");
//根据fopen函数返回值可知如果以"r"模式打开文件后文件的值为
//空,说明该文件不存在,我们可以使用perror在屏幕上打印错误信
// 息,并且提前返回
if (pf == NULL)
{
perror(pf);
return 1;
}
//读文件
//关闭文件
fclose(pf);
pf = NULL;
//文件关闭后应及时置为空
return 0;
}
代码2://以"w"模式打开
int main()
{
//打开文件,以写的形式打开
FILE* pf = fopen("test.txt", "w");
//如果以"w"模式打开文件后该文件不存在,我们会主动新建1个名为
// "test.txt"的文件
if (pf == NULL)
{
perror(pf);
return 1;
}
//写文件
//关闭文件
fclose(pf);
pf = NULL;
//文件关闭后应及时置为空
return 0;
}
4.文件的顺序读写
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数 | 所以输入流 |
fputc | 字符输出函数 | 所以输出流 |
fgets | 文本行输入函数 | 所以输入流 |
fputs | 文本行输出函数 | 所以输出流 |
fscanf | 格式化输入函数 | 所以输入流 |
fprintf | 格式化输出函数 | 所以输出流 |
fread | 二进制输入 | 文本输入流 |
fwrite | 二进制输出 | 文本输出流 |
4.1 fgetc的使用
一个字符一个字符的读取
提醒:如果fgetc读取字符成功,返回的是该字符的ASCII码值
如果读取文件结尾或者读取失败的时候,返回EOF(-1)。
代码1://fgetc的使用
test.txt文件
acbdhjm
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
结果:
讲解:一开始的时候鼠标指向第一个字符前面的位置,调用fgetc的时候就会读取到第一个字符a,此时鼠标就会移动到a的后面,c的前面,再次调用fgetc就会向后读取字符c,使用printf将c打印在屏幕上。
假设我们将test.txt文件中的内容改为acb
结果如下:
此时鼠标指向第一个字符a的前面,向后读取一个字符a,在屏幕上打印字符a
此时鼠标指向第一个字符a的后面,向后读取一个字符c,在屏幕上打印字符c
此时鼠标指向第二个字符c的后面,向后读取一个字符b,在屏幕上打印字符b
此时鼠标指向第三个字符b的后面,此时鼠标已指向文件末尾,所以会返回EOF(-1)。
代码2:
//test.txt文件
abcdefghijklmnopqrstuvwxyz
//将26个英语字母打印在屏幕上
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror(pf);
return 1;
}
//读文件
//将26个英语字母打印
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
标签:文件,字符,输出,C语言,pf,FILE,操作,打开 From: https://blog.csdn.net/2302_80892233/article/details/137060384