南昌大学C++实验报告(8)

南昌大学实验报告

---(8)文件操作

学生姓名: 学 号: 专业班级: 实验类型:□ 验证 □ 综合 ■ 设计 □ 创新 实验日期: 2018.1.5 实验成绩:

一、实验目的

(1)了解文件和文件指针的概念。

(2)掌握文件打开和关闭以及简单的文件操作函数的调用方法。 (3)学会使用缓冲文件系统对文件进行简单操作。

二、实验内容

(1)编写函数filtercopy,将一个文件中的英文字母和数字复制到另一个文件中。 (2)编写程序,将下表数据存入文件中,并根据输入的记录范围显示相应记录。

Num 3010 1020 2030 3040 1050 Name 张改革 李平平 王纷纷 胡天天 卢齐全 birthday year 1963 1972 1946 1956 1990 month 12 6 11 9 2 day 23 4 9 21 2 三、实验要求

1、需写出设计说明; 2、设计实现代码及说明 3、运行结果;

四、主要实验步骤

1.在编辑器中编写代码(实验用的是atom)。

2.使用g++编译器对源代码进行编译,根据错误提示进行代码修改。 3.运行程序,记录实验结果。

五、实验数据及处理结果

实验前的准备:首先新建两个文本文件,从第一个文件中读取数据,筛选相应的字符写入第二个文件。在第一个文件中写入“123hjk ./;’”这些信息。然后查看写入的结果。

在运行程序前,先查看文件中的内容(第一行),可以看到,文件中是空的,接着,编译写好的C++源代码,编译通过,没有错误信息提示。接着执行程序,执行完成后,程序给出提示信息,拷贝成功,再次查看文件的内容,可以看到正确的结果

#include #include

void filtercopy(char *sf, char *df);

int main() {

char path1[20] = \ char path2[20] = \

filtercopy(path1, path2);

std::cout<<\ return 0; }

void filtercopy(char *sf, char *df){ using namespace std;

ifstream ifile(sf); ofstream ofile(df);

char c;

if(ifile.is_open() && ofile.is_open()){ while(ifile.get(c)){

if((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >=’A’&& c <= ‘Z’))

ofile << c; } }

ofile << '\\n'; //为了在Linx终端界面下友好显示,追加一个换行符,否则打印结 果会有一个讨厌的百分号

ifile.close(); ofile.close(); }

----------------------------------------------------------------------------------------------------------------

这个实验用C++完成,编写了一个过滤拷贝的函数,形参是两个文件路径的指针,根据这个路径指针可以定位到相应的文件,然后用文件流的.get()方法,获取单个字符,配合循环,将源文件中的每个字符进行扫描,符合条件的就写入到另外的文件中。最后关闭文件流,释放资源。

第一二行是读写文件时的提示信息,第三行提示用户输入查询记录的编号,根据输入,在文件中读取数据进行查找相应的记录,若存在记录则则打印相应的全部信息,否则提示不存在这样的记录。

#include

struct birthday {

int year; int month; int day; };

struct person {

int num;

char name[10];

struct birthday birth_day; };

struct person students[5] = {

{3010, \张改革\ {1020, \李平平\ {2030, \王纷纷\ {3040, \胡天天\ {1050, \卢齐全\};

struct person temp[5] = { {0, \ {0, \ {0, \ {0, \ {0, \};

void writeRecords(); void readRecords();

void showInfo(struct person p);

int main() {

writeRecords(); readRecords();

int n = 0;

printf(\ scanf(\

int res = 0;

for(int i = 0; i<5; ++i){ if(temp[i].num == n){ showInfo(temp[i]); res = 1; break; } }

if(res == 0)

printf(\

return 0; }

void writeRecords(){ FILE *fp;

fp = fopen(\

if(fp == NULL)

printf(\

for(int i = 0; i<5; ++i){

if(fwrite(&students[i], sizeof(struct person), 1, fp) != 1){ printf(\ break; }

}

fclose(fp); fp = NULL;

printf(\}

void readRecords() {

FILE *fp;

fp = fopen(\ if(fp == NULL){

printf(\ }

for(int i = 0; i<5; ++i){

int res = fread(&temp[i],sizeof(struct person), 1, fp); if(res != 1){

printf(\ break; } }

fclose(fp);

fp = NULL;

printf(\}

void showInfo(struct person p){

printf(\%s %d %d %d\\n\p.num, p.name, p.birth_day.year, p.birth_day.month,

p.birth_day.day);

}

这个实验用C语言实现,将一个结构体数组写入文件,以二进制的形式写入,没有采用相应的编码规则,所以直接查看文件内容会出现乱码。然后再从文件中读取这些记录,存入定义的全局变量temp结构体数组中,提示用户输入编号,根据编号在结构体中进行查找记录,若命中记录,则调用显示信息的函数,将这个记录的信息打印出来。否则给出记录不存在的提示。

(直接查看文件出现的乱码情况)

六、实验体会或对改进实验的建议

这次实验学习了用C和C++进行文件读写的操做,第一个实验用C++语言编写,第二个采用C语言,将两者的操作都体验了一遍。

之前写过的所有程序都是要在程序运行是动态输入的,如果输入的数据量很大,或者输入了错误的数据,将会十分影响程序的效率。这时,文件的优势就体现出来了:在程序运行之前就可以提前将数据准备好,编写相应的读取数据函数就可以把数据一次性导入到程序中。

使用文件时是比价麻烦的,C++相对较好,有流的面向对象的概念,结合流提供的成员函数,使用起来比较方便。C语言面向过程,使用每个功能要记住对应的函数。在定位文件时,要注意文件的路径正确写法。而且文件资源使用完毕后要记得关闭。

七、参考资料

《C/C++程序设计(第二版)》张树粹主编 《C Primer plus》

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4