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

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. SQL注入之注入点的寻找

    注入点的判断 判断一个链接是否存在注入漏洞,可以通过对其传入的参数(但不仅仅只限于参数,还有cookie注入,HTTP头注入等) 进行构造,然后对服务器返回的内容进行判断来查看是否存在注入点. 注入点 ...

  2. gdi和gdi+比较

    http://www.360doc.com/content/10/1013/17/1066008_60709410.shtmlhttp://www.360doc.com/content/10/1013 ...

  3. 【秒懂Java】【第1章_初识Java】04_学习资料

    为了学到更多的新知识,我们经常会去网上搜索各种学习资料.或者,在学习.工作过程中遇到了解决不了的问题,我们也会去网上搜索答案(比如百度.谷歌一下).这篇文章,主要想跟大家聊聊关于学习资料的选择. 建议 ...

  4. webpack模块打包简易版

    webpack基本使用流程(react) 1.安装webpack脚手架 cnpm install webpack webpack-cli -D 2.安装处理css的loader cnpm instal ...

  5. 一.django初识

    1.创建django项目:[vagrant@CentOS7 vagrant]$ django-admin startproject devops [vagrant@CentOS7 vagrant]$ ...

  6. 从发布-订阅模式谈谈 Flask 的 Signals

    发布-订阅模式 发布-订阅模式,顾名思义,就像大家订报纸一样,出版社发布不同类型的报纸杂志不同的读者根据不同的需求预定符合自己口味的的报纸杂志,付费之后由邮局安排人员统一派送. 上面一段话,提到了发布 ...

  7. Quartz.Net系列(九):Trigger之CronScheduleBuilder和Cron表达式详解

    1.使用 var scheduler =await StdSchedulerFactory.GetDefaultScheduler(); await scheduler.Start(); var jo ...

  8. 基础设计模式-03 从过滤器(Filter)校验链学习职责链模式

    1.职责链路模式 1.1UML图 1.2 职责链路模式的概念 为了避免处理对象的耦合关系,将对象连成一个链,沿着这个链进行访问,直到有一个对象处理位置: 1.3 优点 1.按照一定的顺序执行判断: 2 ...

  9. Shein一面(视频面)07.07

    应聘职位:Java工程师 时长:30min 面经: Spring讲一下 SpringAOP用到什么设计模式 JVM包括什么 运行时数据区包括什么 什么时候入栈,出栈 Sychronized和可重入锁区 ...

  10. day03总结

    一. 基本数据类型# 1.整型int# 作用:记录年龄.等级.号码等状态# 定义与使用# age = 999# level = 10# qq = 383838338 # res=age * 1# pr ...