前述:基于上学期完成的数据结构的课程设计,对于老师的提出要求实现的基础上,自己在使用过程中发现每次打开程序都需要重新输入数据,于是便决定,将文件读写功能加入此次课程设计中,以下是我的一些心得和浅显理解。

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()函数可以实现类似printfscanf函数中的格式化输入输出功能,但后来根据课本中描述中,由于在输入时要将文件中的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语言中对文件的读写的一些浅显理解的更多相关文章

  1. c语言中的文件格式化读写函数fscanf和fprintf函数

    很多时候我们需要写入数据到文件中时都觉得很困扰,因为格式乱七八槽的,可读性太差了,于是我们就想有没有什么函数可以格式化的从文件中输入和输出呢,还真有.下面我将讲解一下fscanf和fprintf的强大 ...

  2. VC中对文件的读写

    http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2.电脑处理 ...

  3. 【转】VC中对文件的读写

    原文网址:http://www.cnblogs.com/LJWJL/archive/2012/10/06/2712466.html 注意: 1.由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2 ...

  4. C语言中头文件怎么写?(本文来源网络,由黑乌鸦进一步完善)

      c语言头文件怎么写?我一直有这样的疑问,但是也一直没去问问到底咋回事:所以今天一定要把它弄明白! 其实学会写头文件之后可以为我们省去不少事情,可以避免书写大量的重复代码.有利于整理思路.使代码脉络 ...

  5. C语言中以文本方式读写文件时换行符转换的注意事项

    我们知道在UNIX下是没有回车符(\r)的,只有换行符(\n),而C语言诞生于UNIX(Linux即面向开源的UNIX,Mac OS也是UNIX发展而来的,而Windows是从MS-DOS发展而来,与 ...

  6. c语言中的文件流

    一.打开和关闭文件 #include int main( void ) { FILE* pReadFile = fopen( "E:\\mytest.txt", "r&q ...

  7. C语言中的文件操作

    按照字符的方式读取文件 按照行的方式读取文件 按照数据块的方式读取文件 按照格式化的方式读取文件 文件分类 记录文件:具有一定的结构记录组成,分为定长和不定长两种方式 流式文件:按照一个字符一个字符( ...

  8. C++中关于文件的读写

    在C++的学习过程中,我们时常要用到对文件的操作,下面我们讲一下文件的读写. 首先,读.也就是把已有的文件读到控制台上,那么如何操作呢?首先要将文件操作的输入输出流包含进去. <fstream& ...

  9. K:java中properties文件的读写

    Properties类与.properties文件:   Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集的类,不过Properties有特殊 ...

随机推荐

  1. python unittest自动测试框架

    编写函数或者类时进行测试,确保代码正常工作 python  unittest 模块提供了代码测试工具.按照定义测试包括两部分:管理测试依赖库的代码(称为‘固件’)和测试本身. 单元测试用于核实函数的某 ...

  2. 小米商城项目(JSP+Servlet项目)

    小米商城项目 项目已托管到GitHub,大家可以去GitHub查看下载!并搜索关注微信公众号 码出Offer 领取各种学习资料! 在这里插入图片描述 基于Servlet+JSP开发的小米商城项目,因为 ...

  3. 又一款开源图标库 CSS.GG,值得一用

    嗨,我是 Martin,也叫老王,今天推荐一款好用的开源图标库. 我们平常找图标往往会去 iconfont 但是今天,我们看了 Martin 的文章之后,就会有一个新的选择--CSS.GG Githu ...

  4. BZOJ1294 洛谷P2566 状态压缩DP 围豆豆

    传送门 题目描述 是不是平时在手机里玩吃豆豆游戏玩腻了呢?最近MOKIA手机上推出了一种新的围豆豆游戏,大家一起来试一试吧游戏的规则非常简单,在一个N×M的矩阵方格内分布着D颗豆子,每颗豆有不同的分值 ...

  5. day36 解决粘包问题

    目录 一.tcp粘包问题出现的原因 二.解决粘包问题low的办法 三.egon式解决粘包问题 四.实现并发 1 tcp 2 udp 一.tcp粘包问题出现的原因 前引: tcp的客户端与服务端进行通信 ...

  6. www.215wd.com

    www.215wd.com 传奇销售系统 QQ:1479528000

  7. python 三维散点插值 griddata

    #三维点插值#在三维空间中,利用实际点的值推算出网格点的值import numpy as np point_grid =np.array([[0.0,0.0,0.0],[0.4,0.4,0.4],[0 ...

  8. scrapy 基础组件专题(九):scrapy-redis 源码分析

    下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...

  9. scrapy 基础组件专题(二):下载中间件

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 1.激活Downloader Mi ...

  10. python 并发专题(九):基础部分补充(一)进程

    概念 串行:所有的任务一个一个的完成. 并发:一个cpu完成多个任务.看起来像是同时完成. 并行:多个cpu执行多个任务,真正的同时完成. 阻塞:cpu遇到IO就是阻塞. 非阻塞:没有IO,就叫非阻塞 ...