1 C语言中的动态数组及文件读取

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程实现,函数的参数表示文件路径名,读取完成中将数
据按照数据接口的要求返回。
编程的基本流程


在vs2008的visual C++中打开程序工程文件。
在工程中添加DataReader.c源程序文件。 在DataReader.c文件中添加代码。 关闭DataReader.c源程序的预编译头文件设置。 运行和调试程序。
C语言中的动态数组及文件读取
武汉理工大学 资源与环境工程学院 张晓盼 zxp.whut@163.com
实验的目的

目的在于对后续实验中将要用到的C语言基本知识和编
程方法进行回顾,主要包括:C语言源代码的基本组织 结构、vs2008中编写和编译代码的基本方法、利用结 构体创建和使用动态数组的方法、二进制文件的读取。
在DataReader.c文件中添加代码
代码编写的基本技术见后续ppt
实验中代码编写的基本技术


C语言基本语法(略)
结构体数据变量的初始化


动态数组的存储分配
文件的打开、读取和关闭
结构体成员初始化

C语言编程时建议对于定义的数据变量先进行初始化,然后再使用
,特别是指针类型的变量,一定要在定义后先将其初始化为0值( 在vc环境中可以使用宏NULL表示指针类型的0值),否则有可能
利用fopen打开文件

filename参数是一个字符串,指的是要打开的文件的全路径名,在本实验
中应使用ReadData函数的输入参数值;

mode参数也是一个字符串,表示打开模式,在本实验室由于需要读取的
.ekd文件是一个二进制文件,因此mode参数应设置为“rb”;

该函数返回一个FILE指针类型的变量,该返回值将用于后续的文件操作 函数中,如果返回值为0(或者NULL)说明文件打开失败。只有成功打

count参数也是一个size_t类型变量,表示每一次读取操 作需要读取多少份内容,由于每一份内容都是size个字节
,因此一次fread操作从文件中读取的字节数是
size*count字节;

stream参数是一个FILE指针类型,应使用打开文件时调
用fopen函数的返回值。
利用fread读取文件内容(2)
名,其基本格式如下表:
实验结果及操作方式(1)
程序编写 好后点击 此处运行
点击此处动 态生成测试 数据文件
选择文件保存路径并指定文件名
实验结果及操作方式(2)
选择刚刚创建的数据文件
点击此处读取 数据文件
实验结果及操作方式(3)
正确读取文件后在列表框 中对应显示创建文件时产 生的数据项和数据值,以 及读取得到的数据项和数 据值(左图所示)。

调用一次fread函数表示对指定文件执行一次读取操作;
由于文件是一个顺序存储的二进制线性数据流,因此对于每一个 打开的文件都有一个称为“读写头”的数据来指示各种文件操作 的起始位置;

每一个fread操作都是从读写头指示的位置开始向后(向文件结尾 的方向)读取数据,读取结束后会将读写头后移读取数据的结束 位置;
Precompiled Headers
典型代码结构
定义变量
变量初始化
//。。。。。。读取数据操作 函数返回
其他注意事项

使用完动态数组后应利用free函数释放内存空
间,虽然本实验中该部分由“交互层”部分处
理,但实验者应注意这一要求。
数据接口
功能接口
算法层的数据接口说明
数据接口采用结构体类型,成员与数据文件结构 (下表)向对应; 结构体中包含了动态数组(哪些成员?); 由于数组元素的数据类型是动态生成的,因此包 含了两份动态数组。
算法层的功能接口说明

功能接口就是算法层提供给外界调用算法的函数,在 DataReader.h文件中定义了ReadData函数提供文件读 取功能,具体的读取方法要在DataReader.c文件中编

不断依次调用fread函数相当于依次顺序读取文件中的内容。
利用feof函数判断是否达到文件尾部

当读写头数据指向文件结尾后,fread操作就不能再继续读取数 据,可以通过feof函数判断读写头数据是否指向文件尾部;

stream参数表达了需要判断读写头位置的文件,该函数返回一个
int型数值,如果返回值为0表示尚未到达文件尾部,否则表示已到 达文件尾部。
visual C++中打开程序工程文件(1)
visual C++中打开程序工程文件(2)
打开后可以在“解决方案管理器” 中查找各种文件
添加DataReader.c源程序文件(1)
添加DataReader.c源程序文件(2)
由于前面的操作
中添加的是c++ 源程序文件
(.cpp),需要将
其更改为c语言源 程序文件(文件扩 展名改为.c)

在C语言中通常利用sizeof()辅助定义存储空间的尺寸

在使用该函数时需要将返回的指针变量转换为需要的类型,例如:

int * p = (int*)malloc(5 * sizeof(int)) 表示开辟了长度为连续5个int型数据的内存空间 转换为(int*)表示将这段空间用来作为一个整型数组(有多少个元素?),以 后可以用与数组变量一致的p[索引]来访问各个元素
利用fclose关闭文件

当文件不再需要使用后,应该关闭文件,文件被关闭后 将不能再进行其他操作,但如果不关闭,则该文件只能 被当前的程序所独占。
关闭DataReader.c源程序的预Baidu Nhomakorabea译头文件设置

vs2008中编译.c源程序时需要关闭预编译头文件设置:
Not Using Precompiled Headers

char * s = (char*)malloc(5 * sizeof(int)) ?

注意:当空间不再使用时,要用free()函数释放内存,例如free(p)
文件的打开、读取和关闭

“文件”是存储在外部介质中的二进制线性数据流,读
取文件内容的过程总体上按照“打开文件-顺序读取内 容-关闭文件”三个阶段完成,这个过程中可以使用c语 言标准函数库中的fopen、fread、fclose三个函数实现 文件操作。
实验效果和主要任务
交互层代码
教师 提供
数据和函数接口
学生 实现
算法层代码
实验基本原理(1)

教师利用vs2008+MFC进行C++环境下的Windows编程,实现图
形显示和必要的用户交互操作功能(称为“交互层”),并给出C 语言形式的接口规范,学生利用C语言完成给定的GIS算法与数据
结构编程任务,并按照给定接口规范将数据输出(称为“算法
层”)给显示和交互环境部分加以展现的评判。

接口规范采用C语言.h文件的形式给出,学生自行编写源代码(.c 文件)实现指定.h文件的规定的功能和输出数据结构,完成后将源 代码包含进MFC工程中进行集成编译并产生结果。
实验基本原理(2)

基本实验过程是:由交互层动态产生指定格式的测试数据文件, 由算法层实现文件的读取,最终将测试数据的原始信息与读取之 后的信息对比显示以确定实验结果。测试数据文件以(.ekd)为扩展
产生比较严重内存访问错误。在ReadData函数中需要以struct
FileData结构体类型变量的形式创建返回值,在创建结构体数据变 量之后应立即对变量中各个成员的取值进行初始化,特别是其中 的指针类型成员。
动态数组的存储分配

malloc函数的定义是:

void* malloc(unsigned int size) //含义是在内存中分配size个字节的存储空 间,返回一个void*类型的指针变量表示这一段内存空间的起始地址
开的文件才能进行各种操作。
利用fread读取文件内容(1)

buffer参数是void指针类型的变量,表示存储读取值的变 量的地址;

size参数是一个size_t类型变量,可以简单的将size_t类 型看做一个unsigned int类型,该参数表示从文件中读取 的每一份内容的字节数;
fread函数返回一个 size_t类型的值表示实际 读取到的字节数,由于碰 到文件结尾或者文件中存 在异常数据的原因, fread操作有可能并不能 按要求读取size*count个 字节的内容
对话框下部的文本框显示
对比统计信息和得分,分 值是读取正确率*100。
编程内容

算法层的实现方式
编程的基本流程


基础知识
文件信息的读取 典型的代码结构
算法层的实现方式

“算法层”的基
本调用接口定义 在DataReader.h
文件中,学生需
要完成的任务是 编写该头文件的 实现部分( DataReader.c文 件)。
相关文档
最新文档