欢迎来到本期频道!
你是否好奇文件到底是什么?是否想知道文件能干什么?
一:文件
1.什么是文件
2.文件名
例如:“D:\WeCha__t\WeChat.exe”
3.(文件功能角度)文件分类:
数据文件
文件的内容不一定是程序,而是程序运行时读写的数据。比如程序运行时需从中读取数据或往其中输出数据的文件。可以输入数据或着读取数据的文件。 |
将内存中的数据不加转换地存储到文件中的文件叫二进制文件.(二进制编辑器打开)
将内存中的数据转换成ASCLL码的形式存储到文件中的文件叫文本文件.(文本编辑器打开)
举例说明:
程序文件
例如:.c文件 .obj文件 .exe文件等
二:流
我们的程序需要输出到外部设备,或者从外部设备读取数据,不同的外部设备输入输出操作不同,为了方便程序员对各种设备的操作,抽象出了流的概念,可以把流想象成流淌着字符的河。 |
那为什么我们使用scanf,printf时没有打开流呢?
是因为C程序启动时,默认打开了3个标准流
标准流 | 含义 |
---|
stdin | 标准输入流,大多数环境下,从键盘输入。 |
stdout | 标准输出流,大多数环境下,从屏幕输出。 |
stderr | 标准错误流,大多数环境下,从屏幕输出。 |
1.这里的stdin,stdout,stderr是FILE*型,是文件类型指针。
2.每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息。
3.这个文件信息区是由系统声明的结构体变量,类型取名为FILE。这里的文件指针(stdin…)就是来维护文件信息区的。
三:文件操作
1.打开文件
FILE* fopen ( const char * filename, const char * mode );
文件使用方式 | 含义 | 如果指定文件不存在 |
---|
“r” / “rb” | 为了输入数据,以只读方式打开指定 文本/二进制 文件 | 出错 |
“r+” / “rb+” | 为了输入输出数据,打开指定 文本/ 二进制 文件 | 出错 |
“w” / “wb” | 为了输出数据,打开指定 文本/二进制 文件 | 建立新文件 |
“w+” / “wb+” | 为了输出输入数据,打开指定 文本/二进制 文件 | 建立新文件 |
“a” / “ab” | 给 文本/二进制 文件末尾添加数据 | 建立新文件 |
“a+” / “ab+” | 在 文本/二进制 文件末尾输入输出数据 | 建立新文件 |
2.操作文件
功能 | 函数名 | 适用于 |
---|
字符 输入函数 | fgetc | 所有输入流 |
字符 输出函数 | fputc | 所有输出流 |
| | |
文本行 输入函数 | fgets | 所有输入流 |
文本行 输出函数 | fputs | 所有输出流 |
| | |
格式化 输入函数 | fscanf | 所有输入流 |
格式化 输出函数 | fprintf | 所有输出流 |
| | |
二进制 输入 | fread | 文件 |
二进制 输出 | fwite | 文件 |
3.关闭文件
int fclose ( FILE * stream );
由于fgets,fputs比较特殊,
这里我们介绍一下fgets,fputs:
Ⅰ.fputs
#include<stdio.h>
int main()
{
FILE* fp = fopen("test.txt", "r+");
if (fp == NULL)
{
perror("fopen:");
return 1;
}
char ch[] = "xxxx";
fputs((const char*)ch, fp);
fclose(fp);
fp = NULL;
return 0;
}
Ⅱ fgets
#include<stdio.h>
int main()
{
FILE* fp = fopen("poet.txt", "r");
if (fp == NULL)
{
perror("fopen:");
return 1;
}
char ch[4][20] = { 0 };
int i = 0;
while (fgets(ch[i], 20, fp) != NULL)
{
printf("%s", ch[i]);
i++;
}
fclose(fp);
fp = NULL;
return 0;
}
我们调试一下来观察:
文本中第20个字符是'g',这里表明没有读取'g',然后添加了'\0'. |
这里表明空间足够的情况下,遇到'\n'会停止,然后加上'\0'. |
与上述相同。
与上述相同。
四:文件相关函数
文件缓冲区
缓存文件系统:系统自动地在内存中为每一个正在使用的文件开辟一块“文件缓冲区”。 |
当缓冲区填满,或者主动输入输出,数据才会进入数据区/硬盘。 |
1.fseek
int fseek ( FILE * stream, long int offset, int origin );
该函数是用来设置文件指针位置的。
第一个参数是要操作的流;
第二个参数是相对于参考位置的偏移量;
第三个参数是参考位置;
常量 | 参考位置 |
---|
SEEK_SET | 文件起始位置 |
SEEK_CUR | 文件当前位置 |
SEEK_END | 文件末尾 |
2.rewind
void rewind ( FILE * stream );
3.feof
int feof ( FILE * stream );
在读取结束的情况下,该函数可判断是否是遇到 文件末尾 而导致的读取结束。是,返回非0;否,返回0. |
4.ferror
int ferror ( FILE * stream );
在输入/输出操作结束后,判断是否是遇到 错误 而导致的读取结束。 |
5.ftell
long int ftell ( FILE * stream );