C语言中对文件的读写的一些浅显理解
C语言中文件读写的一些浅显理解
由于本科课程中,对于文件读写这一方面老师没有涉及,后来一直也很少使用,也没有做过深刻的理解和认知,没有查阅课本资料之前自己以为只能按顺序或者指定位置读取指定多少个字节数据,查询课本之后发现,所现有的功能远比我想象的丰富,使用起来非常方便。
- 打开或关闭文件
- 顺序方式读写文件
- 格式化方式读写文件
- 二进制方式读写文件
- 实现过程中的心得和总结
以上几个方面,就是今天所涉及到的几个方面
一 打开或者关闭文件:
对文件的各种操作都基于打开文件的基础上,通过引用stdlib.h头文件,调用fopen()函数打开文件,返回一个文件类型指针。该指针就是该文件的首地址,可通过FILE *fp方式定义一个文件类型指针fp使其指向该文件的首地址。若文件打开错误,或者建立文件失败,则会返回一个空指针NULL。关于文件的使用方式,我查阅相关资料整理了一个表格,详细介绍如图所示
文件的使用方式和含义
| 打开方式 | 含义 | 指定文件不存在时 | 指定文件存在时 |
| r | 只读方式打开文本文件 | 出错 | 正常打开 |
| w | 只写方式打开文本文件 | 建立新文件 | 文件原有内容丢失 |
| a | 追加方式打开文本文件 | 建立新文件 | 在原有内容末尾追加 |
|
r+ |
读/写方式打开文本文件 | 出错 | 正常打开 |
| w+ | 读/写方式创建新的文本文件 | 建立新文件 | 文件原有内容丢失 |
| a+ | 读/追加方式建立新的文本文件 | 建立新文件 | 在原有内容末尾追加 |
| rb | 只读方式打开二进制文件 | 出错 | 正常打开 |
| wb | 只写方式打开二进制文件 | 建立新文件 | 文件原有内容丢失 |
| ab | 追加方式打开二进制文件 | 建立新文件 | 在原有内容末尾添加 |
| rb+ |
读/写方式打开二进制文件 |
出错 | 正常打开 |
| wb+ | 读/写方式创建新的二进制文件 | 建立新文件 | 文件原有内容丢失 |
| ab+ | 读/追加方式创建新的二进制文件 | 建立新文件 | 在原有内容末尾追加 |
文件文件在使用结束后,为了避免误用,保护文件内容。应当使用fclose()函数关闭文件指针。fclose函数关闭文件时,先把缓冲区中的数据输入到磁盘文件,然后撤销文件的信息区。
调用格式:
fopen(文件名,使用方式);
fclose(文件指针)
有关代码如下:
#include <stdlib.h> FILE* fn;
fn=fopen("C:\saveNum.dat","wb");
fclose(fn);
二 顺序方式读写文件:
顺序方式读写文件的函数,为便于理解,整理以下表格,内容如下
| 函数名 | 调用形式 | 功能 | 返回值 |
| fgetc | gfetc(fp) | 从fp指向的文件读入一个字符 | 读成功,带回所读的字符,失败则返回文件结束标志EFO即-1 |
| fputc | fputc(ch,fp) | 把字符ch写到文件指针变量fp所指向的文件中 | 输出成功,返回值就是输出的字符,输出失败失败则返回文件结束标志EFO即-1 |
三 格式化方式读写文件:
看到此方法是,感觉是个很不错的,比较符合我预期理想。
通过调用fprintf()和fscanf()函数可以实现类似printf和scanf函数中的格式化输入输出功能,但后来根据课本中描述中,由于在输入时要将文件中的ASII码转换为二进制形式再保存在内存变量中,在输出时又要将内存中的二进制形式转换为字符,要花费较多的时间,因此,在频繁的内存与磁盘交换数据的情况下,最好不要用此函数,可转换为后面所描述的二进制的读写方式,达到需求,
调用的一般格式:
fprintf(文件指针,格式化字符串,输出列表)
fscanf(文件指针,格式化字符串,输入列表)
样例代码如下:
fprintf(fp,"%d,%6.2f",i,f);
//在磁盘上得到的结果为:
//3, 4.50 fscanf(fp,"%d,%f",&i,&f);
//和scanf一样,主要不要忘记,取地址符
四 二进制方式读写文件:
此方式,可以进行多种类型的输入输出,并且可以读入读出一组数据,方便有效,最为推荐。
调用的一般格式为:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:是一个地址。对于fread来说,他是用来存放从文件读入的数据的存储区的地址,对与fwrite来说,是要将此地址开始的存储区中的数据向文件输出(以上指的是起始地址)
size:要读写的字节数
count:要读写多少个数据项(每个数据项的长度为size)
fp:FILE类型指针
以下是我代码中的输入输出代码:
fwrite(&num,sizeof(int),,fn);
fread(&num,sizeof(int),,fn); for(int i=;i<num;i++){
fread(&schoolInfomation,sizeof(Information),,fp);
InsertData(T,schoolInfomation);
}
//可以通过循环不断地进行读取文件中的数据
//并且可以进行结构体的输入和输出
综上:
代码补充:
综上,结合之前数据结构的程序设计,故将文件的输入和输出做了补充,有关补充的函数代码如下:
//遍历二叉顺序树存储到文件
Status InOrderTraverseToFile(BiTree T,FILE* fp,int &num){
if(T->lchild)
InOrderTraverseToFile(T->lchild,fp,num);
Information schoolInfomation;
schoolInfomation.grade=T->grade;
strcpy(schoolInfomation.university,T->university);
fwrite(&schoolInfomation,sizeof(Information),,fp);
num++;
if(T->rchild)
InOrderTraverseToFile(T->rchild,fp,num);
return OK;
} Status saveFile(BiTree T){
int num=;
FILE* fp;
FILE* fn;
fn=fopen("C:\\saveNum.dat","wb");
fp=fopen("C:\\saveSchoolInfomation.dat","wb");
InOrderTraverseToFile(T,fp,num);
fwrite(&num,sizeof(int),,fn);
fclose(fp);
fclose(fn);
return OK;
} Status readFile(BiTree &T){
int num=;
FILE* fp;
FILE* fn;
Information schoolInfomation;
fn=fopen("C:\\saveNum.dat","r");
fp=fopen("C:\\saveSchoolInfomation.dat","r");
fread(&num,sizeof(int),,fn);
for(int i=;i<num;i++){
fread(&schoolInfomation,sizeof(Information),,fp);
InsertData(T,schoolInfomation);
}
fclose(fp);
fclose(fn);
return OK;
}
总结
结合此次设计,在学习过程遇到的错误,因为习惯了网址的书写方式,故在书写文件名的文件路径时,忘记了转义字符的事情。没有在指定文件夹下面发现要存储使用的dat文件,却在程序目录中发现了负责存储的dat文件,故在书写文件路径时\一定要书写成\\通过转义得到所需的\。最后的二进制的输入输出方式,对我所想的结构体类型的数据存储十分友好,并且可以通过循环来不断的取文件中的数据,达到自己的目的。由此,感谢书写过程中,其他博主的帖子给我的指引还有谭浩强老师的教材中的很多理论基础。非常感谢!
C语言中对文件的读写的一些浅显理解的更多相关文章
- c语言中的文件格式化读写函数fscanf和fprintf函数
很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有.下面我将讲解一下fscanf和fprintf的强大 ...
- VC中对文件的读写
http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理 ...
- 【转】VC中对文件的读写
原文网址:http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2 ...
- C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)
c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...
- C语言中以文本方式读写文件时换行符转换的注意事项
我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...
- c语言中的文件流
一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...
- C语言中的文件操作
按照字符的方式读取文件 按照行的方式读取文件 按照数据块的方式读取文件 按照格式化的方式读取文件 文件分类 记录文件:具有一定的结构记录组成,分为定长和不定长两种方式 流式文件:按照一个字符一个字符( ...
- C++中关于文件的读写
在C++的学习过程中,我们时常要用到对文件的操作,下面我们讲一下文件的读写. 首先,读.也就是把已有的文件读到控制台上,那么如何操作呢?首先要将文件操作的输入输出流包含进去. <fstream& ...
- K:java中properties文件的读写
Properties类与.properties文件: Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集的类,不过Properties有特殊 ...
随机推荐
- 千金良方说:"我现在奉上179341字的MySQL资料包,还来得及吗?有"代码段、附录、和高清图!!"
上一篇"上发布过"一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了",我在更早之前,在微信公众号"老叶茶馆"上发布 ...
- Illegal reflective access by org.apache.hadoop.security.authentication.util.KerberosUtil
在使用Java API操作HBase时抛出如下异常: Illegal reflective access by org.apache.hadoop.security.authentication.ut ...
- Spring 容器的初始化
读完这篇文章你将会收获到 了解到 Spring 容器初始化流程 ThreadLocal 在 Spring 中的最佳实践 面试中回答 Spring 容器初始化流程 引言 我们先从一个简单常见的代码入手分 ...
- vim常用指令参考
(完)
- CentOS 的数字命令级别
1 user commands 2 system calls 3 library functions 4 special files 5 file formats 6 ...
- linux之文件基本操作
文件/目录管理命令: cd命令主要是改变目录的功能 cd ~ 返回登录目录 cd / 返回系统根目录 cd ../ 或者cd .. 返回上一级目录 cd - 返回上一次访问的目录 pwd命令用于显 ...
- 【Oracle】表碎片重用规则
看完该篇文章你可以了解如下问题:表碎片是如何产生的,这些碎片能否重用? 数据库版本如下: SYS@zkm> select banner from v$version where rownum=1 ...
- 【线型DP】【LCS】洛谷P4303 [AHOI2006]基因匹配
P4303 [AHOI2006]基因匹配 标签(空格分隔): 考试题 nt题 LCS优化 [题目] 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...
- ASP.NET MVC Route详解
在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...
- 小师妹学JVM之:Dirty cards和PLAB
目录 简介 分代收集器中的空间划分 Write barrier和Dirty cards PLAB old space分配对象 总结 简介 分代垃圾回收器在进行minor GC的时候会发生什么操作呢?有 ...