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有特殊 ...
随机推荐
- ceph对象存储RADOSGW安装与使用
本文章ceph版本为luminous,操作系统为centos7.7,ceph安装部署方法可以参考本人其他文章. [root@ceph1 ceph-install]# ceph -v ceph vers ...
- html+css快速入门教程(6)
9 综合实例 仿百度云盘下载页面实战 10 表格 10.1 table table 为表格标签 可以让我们的表格在浏览器中显示 table 下面还有两个常用标签 tr 和 td tr表示一行 td表示 ...
- SpringBoot之入门教程-SpringBoot项目搭建
SpringBoot大大的简化了Spring的配置,把Spring从配置炼狱中解救出来了,以前天天配置Spring和Mybatis,Springmvc,Hibernate等整合在一起,感觉用起来还是挺 ...
- JS中style.display和style.visibility的区别
在JS中可以通过设置style.display或者style.visibility属性来控制元素是否显示,在style.display=block和style.visibility=visible的时 ...
- day03组件
1.text 编写文本信息,等价于span 2.view 等价于div 3.image ============================wxml====================== ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
- POJ3263 Tallest Cow 差分
题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a p ...
- 阿里云centos7服务器nginx配置及常见问题解答
前言: 本文参考了jackyzm的博客:https://www.cnblogs.com/jackyzm/p/9600738.html,进行了内容的更新,并请注意这里适用的版本是centos7的版本.并 ...
- 论TEMP临时变量与VAR静态变量
TEMP临时变量:顾名思义,这种变量类型是临时的,没有固定的存放数据的内存空间.每次扫描结束后则清零,在下个扫描周期开始时,这个变量的值都是不确定的,一般为0.使用临时变量需要遵循一个原则:先赋值再使 ...
- shell专题(六):条件判断
1.基本语法 [ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ atguigu ]返回true,[] 返回false. 2. 常用判断条件 (1)两个整 ...