| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 详解文件操作(细致总结) -> 正文阅读 |
|
[C++知识库]详解文件操作(细致总结) |
目录 1.fseek函数(根据文件指针的位置和偏移量来定位文件指针) 什么是文件?磁盘上的文件是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件 1.程序文件源文件(后缀为.c),目标文件(后缀为.obj),可执行程序(后缀为.exe) 2.数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件, 3.文件名一个文件要有一个唯一的文件标识,以便用户识别和引用,文件标识被称为文件名 文件名包含:文件路径+文件名主干+文件名后缀
文件的打开和关闭1.文件指针缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针” 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息,这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便 我们试着创建一个FILE*指针变量
定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区,通过该文件信息区中的信息就能够访问该文件,也就是说通过文件指针变量能够找到与它关联的文件
|
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
?1.相对路径
?2.绝对路径
?注意fopen函数打开文件可能会失败所以要对返回值进行判断
FILE* pf = fopen("test.txt", "w");//打开文件
if (pf == NULL)
{
exit(-1);
}
?了解了打开文件我们来看看如何关闭文件
参数(创建的FILE*类型变量)
fclose(pf);//关闭文件
pf = NULL;
?
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
?参数(输入的字符,流)
?fputc('a', pf);
fputc('a',stdout);
fgetc(pf);
fgetc(stdin);
?注意:fgetc函数成功则返回字符对应的ASCII码值,失败则返回EOF
?参数(要输入的字符串,流)
fputs("hello world\n", pf);
fputs("hello world\n", stdout);
?参数(读取后保存的位置,读取最大字符数,流)
注意参数中读取最大字符数实际要减一,读取结束返回NULL
fgets(buff, 10, pf);
fgets(buff, 10,stdin);
知道了以上文件操作函数我们试着写一个文件拷贝
int main()
{
FILE* pr = fopen("test.txt", "r");
if (pr == NULL)
{
printf("open for reading:%s", strerror(errno));
return 0;
}
FILE*pw = fopen("test1.txt", "w");
if (pw == NULL)
{
printf("open for writing:%s", strerror(errno));
fclose(pr);
pr = NULL;
return 0;
}
int ch = 0;
while ((ch = fgetc(pr)) != EOF)
{
fputc(ch, pw);
}
fclose(pw);
pw = NULL;
return 0;
}
?参数(流,格式化控制参数)
?
参数(流,格式化控制参数)?
int main()
{
struct stu s = { 0 };
FILE* pf = fopen("test1.txt", "r");
if (pf == NULL)
{
return 0;
}
fscanf(pf,"%s %d %lf", s.name, &(s.age), &(s.result));
printf("%s %d %f", s.name, s.age, s.result);
fclose(pf);
pf = NULL;
}
参数(要被写的数据(指针),元素大小,元素个数,流)
int main()
{
struct stu s = { "张三",12,56.99};
FILE* pf = fopen("test1.txt", "wb");
if (pf == NULL)
{
return 0;
}
fwrite(&s,sizeof(s),1,pf);
fclose(pf);
pf = NULL;
}
?参数(数据存储位置,元素大小,元素个数,流)
SEEK_CUR 文件指针当前位置
SEEK_END? 文件末尾位置
SEEK_SET 文件起始位置
参数(流,偏移量,偏移起始位置)
??
rewind(pf);//?fseek(pf, 0, SEEK_SET);同理
根据数据的组织形式,数据文件被称为文本文件或者二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件
feof和ferror函数不能用来判断文件是否结束而是应用于文件读取结束时,判断是读取失败结束还是遇到文件末尾结束
fgetc函数在读取结束时会返回EOF,正常读取时返回读取到的字符的ASCII码值
fgets函数在读取结束时会返回NULL,正常读取时返回存放字符串空间的起始地址
fread函数在读取时返回实际读取到的完整元素个数,如果发现读取到的完整元素个数小于指定元素个数,这就是最后一次读取
?举个例子
int main()
{
FILE* pf = fopen("test.txt", "r");
int ch = 0;
if (pf == NULL)
{
return EXIT_FAILURE;
}
while ((ch=fgetc(pf))!=EOF)
{
putchar(ch);
}
if (feof(pf))
{
printf("\n文件正常结束\n");
}
else if (ferror(pf))
{
printf("\n文件非正常结束\n");
}
}
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”,从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区,缓冲区的大小根据C编译系统决定的
int main()
{
FILE*pf = fopen("test.txt", "w");
fputs("abcdef", pf);
printf("睡眠10秒-已经写数据了,打开test.txt文件,发现文件没有内容\n");
Sleep(10000);
printf("刷新缓冲区\n");
fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到文件(磁盘)
printf("再睡眠10秒-此时,再次打开test.txt文件,文件有内容了\n");
Sleep(10000);
//fclose(pf);
pf = NULL;
return 0;
}
这里可以得出一个结论:
因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件如果不做,可能导致读写文件的问题
3种情况下缓冲区刷新
1.缓冲区满时
2.遇到换行符‘\n’
3.需要输入时候或者程序终止
以上就是有关文件操作的详细总结,觉得可以的还请点赞评论蟹蟹
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:46:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |