文件是指存储在外部存储介质(外存,如:U盘、光盘、硬盘等等)上
数据的集合。操作系统是以文件为单位对数据进行管理的。C语言将每
一个与主机相连的输入或输出设备都看做是一个(广义的)文件。用文
件可以长期保存数据,实现数据共享。
可以对数据进行保存,当我们使用程序编写数据时是存储在电脑的内存中,当程序退出时,内存回收,这些数据也就随之消失,这时使用文件可以来保存我们的数据。
文件分为数据文件和文本文件,本文讨论数据文件。
我们在c语言中 直接使用scanf printf是因为c语言已经默认打开了三个流
•stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这些流的类型都是 FILE*
打开文件时 会在内存中生成文件信息区 生成FILE的结构体变量
最后返回起始地址 即FILE*的指针类型
ANSIC 规定使用 fopen 打开文件 使用 fclose关闭文件
FILE * fopen ( const char * filename, const char * mode );
函数返回FILE* 文件名 打开模式
⽂件使⽤⽅式 | 含义 | 如果指定⽂件不存在 |
---|---|---|
“r”(只读) | 为了输⼊数据,打开⼀个已经存在的⽂本⽂件 | 出错 |
“w”(只写) | 为了输出数据,打开⼀个⽂本⽂件 | 建⽴⼀个新的⽂件 |
“a”(追加) | 向⽂本⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“rb”(只读) | 为了输⼊数据,打开⼀个⼆进制⽂件 | 出错 |
“wb”(只写) | 为了输出数据,打开⼀个⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab”(追加) | 向⼀个⼆进制⽂件尾添加数据 | 建⽴⼀个新的⽂件 |
“r+”(读写) | 为了读和写,打开⼀个⽂本⽂件 | 出错 |
“w+”(读写) | 为了读和写,建议⼀个新的⽂件 | 建⽴⼀个新的⽂件 |
“a+”(读写) | 打开⼀个⽂件,在⽂件尾进⾏读写 | 建⽴⼀个新的⽂件 |
“rb+”(读写) | 为了读和写打开⼀个⼆进制⽂件 | 出错 |
“wb+”(读写) | 为了读和写,新建⼀个新的⼆进制⽂件 | 建⽴⼀个新的⽂件 |
“ab+”(读写) | 打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写 | 建⽴⼀个新的⽂件 |
int main()
{
//打开文件
FILE* pf=fopen("data", "w");
//我并没有创建data文件
//以“w”的方式打开之后 会生成文件
if (pf == NULL)
{
perror("fopen");
return ;
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
FILE* pf=fopen("data", "r");
函数名 | 功能 | 适⽤于 |
---|---|---|
fgetc | 字符输⼊函数 | 所有输⼊流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | ⽂本⾏输⼊函数 | 所有输⼊流 |
fputs | ⽂本⾏输出函数 | 所有输出流 |
fscanf | 格式化输⼊函数 | 所有输⼊流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | ⼆进制输⼊ | ⽂件 |
//打开文件
FILE* pf = fopen("data", "w");
if (pf == NULL)
{
perror("fopen");
return ;
}
//写文件
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);
fputc('d', pf);
此时data文件内存放的就是abcd
int main()
{
fputc('a', stdout);
fputc('b', stdout);
fputc('c', stdout);
fputc('d', stdout);
return 0;
}
fputs 是打印一行 可以是字符串 也可以是数组
struct S
{
float a;
char b;
int c;
};
int main()
{
struct S s= { 3.14f,'w',100 };
//打开文件
FILE* pf = fopen("data", "w");
if (pf == NULL)
{
perror("fopen");
return;
}
fprintf(pf,"%f %c %d", s.a, s.b, s.c);
// //关闭文件
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
//打开文件
FILE* pf = fopen("data", "r");
if (pf == NULL)
{
perror("fopen");
return ;
}
//写文件
int ch = fgetc(pf);
printf("%c ", ch);
ch = fgetc(pf);
printf("%c ", ch);
ch = fgetc(pf);
printf("%c ", ch);
ch = fgetc(pf);
printf("%c ", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
char* fgets(char* str, int num, FILE * stream);
str是将读取的数据放到数组str中
num是最大读取(num-1)个
FILE * stream就是 pf
int main()
{
//打开文件
FILE* pf = fopen("data", "r");
if (pf == NULL)
{
perror("fopen");
return ;
}
//读文件
char arr[100] = { 0 };
fgets(arr,100,pf);
printf("%s", arr);
// //关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fscanf(pf, "%f %c %d", &(s.a),& (s.b), &(s.c));
fwrite(void* ptr, size_t size, size_t count, FILE* stream);
要的数组 数组每个元素大小 个数 pf
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
FILE* pf = fopen("data", "wb");
if (pf == NULL)
{
perror("fopen");
return;
}
fwrite(arr, 4, 10, pf);
fclose(pf);
pf = NULL;
return 0;
}
fread(void* ptr, size_t size, size_t count, FILE* stream);
要读的数组 数组每个元素大小 个数 pf
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
FILE* pf = fopen("data", "rb");
if (pf == NULL)
{
perror("fopen");
return;
}
fread(arr, 4, 10, pf);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
fclose(pf);
pf = NULL;
return 0;
}