admin管理员组文章数量:1558087
文章目录
- 一 什么是文件?
- 1.1文件的概念
- 1.2为什么使用文件
- 1.3文件的种类
- 文件的打开与关闭
- 2.1 流的概念
- 2.2 文件指针 **FILE***
- 2.3文件的打开与关闭
- 文件的读和写
- 3.1写文件
- ①**fput**
- ②**fputs**
- ③**fprintf**
- 3.2读文件
- ①fget
- ②**fgets**
- ③**fscanf**
- 3.3二进制写文件
- **fwrite**
- 3.4二进制读文件
- **fread**
一 什么是文件?
1.1文件的概念
文件是指存储在外部存储介质(外存,如:U盘、光盘、硬盘等等)上
数据的集合。操作系统是以文件为单位对数据进行管理的。C语言将每
一个与主机相连的输入或输出设备都看做是一个(广义的)文件。用文
件可以长期保存数据,实现数据共享。
1.2为什么使用文件
可以对数据进行保存,当我们使用程序编写数据时是存储在电脑的内存中,当程序退出时,内存回收,这些数据也就随之消失,这时使用文件可以来保存我们的数据。
1.3文件的种类
文件分为数据文件和文本文件,本文讨论数据文件。
文件的打开与关闭
2.1 流的概念
流可以抽象为数据流 流是抽象出来的概念
我们在c语言中 直接使用scanf printf是因为c语言已经默认打开了三个流
•stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊。
• stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯。
• stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯。
这些流的类型都是 FILE*
2.2 文件指针 FILE*
打开文件时 会在内存中生成文件信息区 生成FILE的结构体变量
最后返回起始地址 即FILE*的指针类型
2.3文件的打开与关闭
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;
}
当我删除该文件时,以“r”的模式打开
FILE* pf=fopen("data", "r");
会出错
文件的读和写
函数名 | 功能 | 适⽤于 |
---|---|---|
fgetc | 字符输⼊函数 | 所有输⼊流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | ⽂本⾏输⼊函数 | 所有输⼊流 |
fputs | ⽂本⾏输出函数 | 所有输出流 |
fscanf | 格式化输⼊函数 | 所有输⼊流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | ⼆进制输⼊ | ⽂件 |
3.1写文件
①fput
//打开文件
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
当然fputc也可以像屏幕中打印出abcd
int main()
{
fputc('a', stdout);
fputc('b', stdout);
fputc('c', stdout);
fputc('d', stdout);
return 0;
}
②fputs
fputs 是打印一行 可以是字符串 也可以是数组
③fprintf
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;
}
3.2读文件
①fget
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;
}
②fgets
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
fscanf(pf, "%f %c %d", &(s.a),& (s.b), &(s.c));
3.3二进制写文件
fwrite
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;
}
此时文件内容如下
看不懂 那么由二进制读就可以看懂了
3.4二进制读文件
fread
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;
}
博主会在后续文章中更新剩余部分,如果有好的建议欢迎在评论区提出
版权声明:本文标题:【c语言】文件操作详解 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727333693a1108838.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论