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有特殊 ...
随机推荐
- 计算机网络之tcp四次挥手
TCP的四次挥手(Four-Way Wavehand)1.前言对于"三次握手"我们耳熟能详,因为其相对的简单.但是,我们却不常听见“四次挥手”,就算听过也未必能详细地说明白它的具体 ...
- SQL注入之Union注入攻击
union联合查询算是最简单的一种注入了,但是却是经常遇到. 什么是UNION注入 UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列 ...
- Python实用笔记 (14)函数式编程——匿名函数
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时,除了定义一个f(x)的函数外, ...
- nginx使用热部署添加新模块
简介 当初次编译安装nginx时,http_ssl_module 模块默认是不编译进nginx的二进制文件当中,如果需要添加 ssl 证书.也就是使用 https协议.那么则需要添加 http_ssl ...
- 【经验】GaussDB(for MySQL)性能优化 —— 日志的“快递驿站”
GaussDB(for MySQL)数据库在写入性能上,在业界同类产品中是最好的,这主要得益于GaussDB(for MySQL)在MySQL内核方面的诸多优化.其中有一项从“送快递”得来灵感的优化— ...
- Python3笔记016 - 4.1 序列
第4章 序列的应用 python的数据类型分为:空类型.布尔类型.数字类型.字节类型.字符串类型.元组类型.列表类型.字典类型.集合类型 在python中序列是一块用于存放多个值的连续内存空间. py ...
- CSS3 nth-child的使用,详解css中nth的作用,以及nth-child的兼容写法
:nth-child是css3的一个比较常用的选择器.它用于匹配属于其父元素中的子元素,不论元素的类型. 它的参数可以是数字.关键词或公式.下面讲介绍它的使用方法, nth-child的使用 html ...
- 如何写出高性能的CSS3动画
小伙伴们在写CSS3动画时,会发现在手机上很多时候会感到卡顿,然后Google到的解决方案大多是开启GPU加速transform: translate3d(0,0,0); 可解决,但是为什么开启GPU ...
- elasticsearch集群配置 (Tobe Continue)
elasticsearch集群配置 (Tobe Continue) 准备 首先需要在每个节点有可以正常启动的单节点elasticsearch elasticsearch集群配置仅需要在elas ...
- Django---进阶2
目录 数据的查,改,删 django orm中如何创建表关系 django请求生命周期流程图(必会) 路由层 路由匹配 无名分组 有名分组 无名有名是否可以混合使用 反向解析 作业 数据的查,改,删 ...