题目要求

建立两个磁盘文件 f1.dat 和 f2.dat ,编程序实现以下工作:
(1)从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件存放10个);
(2)从 f1.dat 中读入10个数,然后存放到 f2.dat 文件原有数据的后面;
(3)从 f2.dat 中读入20个整数,对它们按从小到大的顺序存放到 f2.dat (不保留原来的数据)。

——谭浩强的《C++面向对象程序设计》第7章习题第4小题

文件

文件是指存储在磁盘类介质上的相关数据的集合, 也称磁盘文件。

程序设计中涉及到的文件主要由两类,一类是程序文件,包括源程序文件、目标文件和可执行文件;另一类是数据文件,即程序输入输出的存储对象,涉及输入输出数据和中间结果。

根据文件中数据的表示形式,文件又分为ASCII文件和二进制文件。ASCII文件就是文本文件,每个字节表示一个字符。二进制文件是把内存中的数据、指令按其在内存中的原始格式存放在磁盘上。

文件流

在C++的I/O类库里定义了几种文件流类,专门用于文件的输入和输出操作:

  • ifstream类,支持从磁盘文件输入
  • ofstream类,支持向磁盘文件输出
  • fstream类,支持对磁盘文件输出和输出

要实现对文件进行输入输出,必须定义一个文件流类对象,用对象调用类的成员函数对文件操作,完成程序与磁盘文件之间的数据传输和交换。

对文件的操作

1.文件的打开与关闭

打开文件有两种实现方法:
(1)建立文件流对象,用对象调用类成员函数open。
格式:

文件流对象.open(文件名,输入输出方式);
  • 文件名可以包括路径,如省略路径,默认文件在当前目录(工程文件目录)。
  • 输入输出方式是在ios类中定义的枚举常量,有多种选择。

(2)在定义文件流对象时指定参数(在构建流对象的同时打开对应文件)
格式:

文件流类 对象(文件名,输入输出方式);
  • 打开文件操作可能成功也可能失败,可以测试文件流对象判定。文件流对象是真,表示成功;否则表示失败。

例如:
以写的方式打开文件 f1.dat

fstream outfile;
outfile.open("f1.dat", ios::out);

或者:

fstream outfile("f1.dat", ios::out);

关闭磁盘文件

  • 文件使用完毕,必须关闭文件,用文件流对象调用关闭文件成员函数实现。
  • 格式: 文件流对象.close();
  • 功能:解除文件流对象与磁盘文件的关联,防止文件数据被意外修改。

2.读写ASCII码文件

可以通过提取、插入运算符(>>、<<)和调用类的成员函数 (put、 get、getline等) 两种方法。

例如:

for (int i = 0; i < 10; i++)
{cin >> a[i]; // 输入10个数存放到outfile1文件中outfile1 << a[i] << " ";
}

程序1

/*
*************************************************************************
@file:    main.cpp
@date:   2020.12.26
@author: Xiaoxiao
@brief:   从键盘输入20个整数,分别存放在两个磁盘文件中
@blog:    https://blog.csdn.net/weixin_43470383/article/details/111665194
*************************************************************************
*/
#include<iostream>
#include<fstream>
using namespace std;int main()
{int a[10];fstream outfile1, outfile2; // 定义两个文件流对象outfile1.open("f1.dat", ios::out); // f1.dat 和 f2.dat 均为输出文件outfile2.open("f2.dat", ios::out);if (!outfile1){cerr << "f1.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){cin >> a[i]; // 输入10个数存放到 f1.dat 文件中outfile1 << a[i] << " ";}for (int i = 0; i < 10; i++){cin >> a[i]; // 输入10个数存放到 f2.dat 文件中outfile2 << a[i] << " ";}outfile1.close(); // 关闭 f1.dat 文件outfile2.close(); // 关闭 f2.dat 文件system("pause");return 0;
}

运行结果1

输入:
1 3 5 7 9 2 4 6 8 10 11 13 15 17 19 12 14 16 18 20

文件 f1.dat 内容:
1 3 5 7 9 2 4 6 8 10

文件 f2.dat 内容:
11 13 15 17 19 12 14 16 18 20

程序2

/*
*************************************************************************
@file:    main.cpp
@date:   2020.12.26
@author: Xiaoxiao
@brief:   从 f1.dat 中读入10个数,然后存放到 f2.dat 文件原有数据的后面
@blog:    https://blog.csdn.net/weixin_43470383/article/details/111665194
*************************************************************************
*/
#include<iostream>
#include<fstream>
using namespace std;int main()
{int a[10];fstream infile1, outfile2; // 定义两个文件流对象infile1.open("f1.dat", ios::in); // f1.dat 作为输入文件outfile2.open("f2.dat", ios::app); // f2.dat 作为输出文件,写入数据添加在文件末尾if (!infile1){cerr << "f1.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){infile1 >> a[i]; // 从 f1.dat 中读入10个数outfile2 << a[i] << " "; // 存放到 f2.dat 文件原有数据的后面}infile1.close(); // 关闭 f1.dat 文件outfile2.close(); // 关闭 f2.dat 文件system("pause");return 0;
}

运行结果2


文件 f1.dat 内容:
1 3 5 7 9 2 4 6 8 10

文件 f2.dat 内容:
11 13 15 17 19 12 14 16 18 20 1 3 5 7 9 2 4 6 8 10

程序3

/*
*************************************************************************
@file:    main.cpp
@date:   2020.12.26
@author: Xiaoxiao
@brief:   从 f2.dat 中读入20个整数并从小到大的顺序(不保留原来的数据)
@blog:    https://blog.csdn.net/weixin_43470383/article/details/111665194
*************************************************************************
*/
#include<iostream>
#include<fstream>
using namespace std;// 选择法排序,不懂的可以看我的博客
// https://editor.csdn.net/md/?articleId=109249369
int sort(int a[])
{int i, j, k, min;for (i = 0; i < 19; i++){k = i;for (j = i + 1; j < 20; j++){if (a[j] < a[k])k = j;}if (k != i){min = a[k];a[k] = a[i];a[i] = min;}}return a[10];
}int main()
{int i, j, k, min;int a[20];fstream infile2, outfile2; // 定义文件流对象infile2.open("f2.dat", ios::in); // f2.dat 作为输入文件if (!infile2){cerr << "f2.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}for (int i = 0; i < 20; i++){infile2 >> a[i]; // 从 f2.dat 中读入20个数}sort(a);infile2.close(); // 关闭f2.dat文件outfile2.open("f2.dat", ios::out); // f2.dat 作为输出文件,文件中原有内容删除if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}for (i = 0; i<20; i++){outfile2 << a[i] << " "; // 向 f2.dat 输出已排序的20个数cout << a[i] << " "; // 同时输出到屏幕}        infile2.close(); // 关闭f2.dat文件system("pause");return 0;
}

运行结果3



文件 f2.dat 内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

程序整合(函数封装)

/*
*************************************************************************
@file:    main.cpp
@date:   2020.12.26
@author: Xiaoxiao
@brief:   从 f2.dat 中读入20个整数并从小到大的顺序(不保留原来的数据)
@blog:    https://blog.csdn.net/weixin_43470383/article/details/111665194
*************************************************************************
*/
#include<iostream>
#include<fstream>
using namespace std;// 选择法排序,不懂的可以看我的博客
// https://editor.csdn.net/md/?articleId=109249369
int sort(int a[])
{int i, j, k, min;for (i = 0; i < 19; i++){k = i;for (j = i + 1; j < 20; j++){if (a[j] < a[k])k = j;}if (k != i){min = a[k];a[k] = a[i];a[i] = min;}}return a[10];
}void fun1()
{int a[10];fstream outfile1, outfile2; // 定义两个文件流对象outfile1.open("f1.dat", ios::out); // f1.dat 和 f2.dat 均为输出文件outfile2.open("f2.dat", ios::out);if (!outfile1){cerr << "f1.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){cin >> a[i]; // 输入10个数存放到 f1.dat 文件中outfile1 << a[i] << " ";}for (int i = 0; i < 10; i++){cin >> a[i]; // 输入10个数存放到 f2.dat 文件中outfile2 << a[i] << " ";}outfile1.close(); // 关闭 f1.dat 文件outfile2.close(); // 关闭 f2.dat 文件
}void fun2()
{int a[10];fstream infile1, outfile2; // 定义两个文件流对象infile1.open("f1.dat", ios::in); // f1.dat 作为输入文件outfile2.open("f2.dat", ios::app); // f2.dat 作为输出文件,写入数据添加在文件末尾if (!infile1){cerr << "f1.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f2.dat 是否成功exit(1);}for (int i = 0; i < 10; i++){infile1 >> a[i]; // 从 f1.dat 中读入10个数outfile2 << a[i] << " "; // 存放到 f2.dat 文件原有数据的后面}infile1.close(); // 关闭 f1.dat 文件outfile2.close(); // 关闭 f2.dat 文件
}void fun3()
{int i, j, k, min;int a[20];fstream infile2, outfile2; // 定义文件流对象infile2.open("f2.dat", ios::in); // f2.dat 作为输入文件if (!infile2){cerr << "f2.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}for (int i = 0; i < 20; i++){infile2 >> a[i]; // 从 f2.dat 中读入20个数}sort(a);infile2.close(); // 关闭f2.dat文件outfile2.open("f2.dat", ios::out); // f2.dat 作为输出文件,文件中原有内容删除if (!outfile2){cerr << "f2.dat open error!" << endl; // 检查打开 f1.dat 是否成功exit(1);}for (i = 0; i < 20; i++){outfile2 << a[i] << " "; // 向 f2.dat 输出已排序的20个数cout << a[i] << " "; // 同时输出到屏幕}infile2.close(); // 关闭f2.dat文件
}int main()
{fun1();fun2();fun3();system("pause");return 0;
}

结果和运行结果3的是一样的。

【C++之文件与文件流】f1.dat 和 f2.dat 文件的读写相关推荐

  1. c语言建立两个磁盘文件,建立两个磁盘文件f1.dat和f2.dat,编程序实现以下工作...

    1)从键盘输入20个整数,分别存放在两个磁盘文件中,每个文件中放10个整数 2)从f1.dat读入10个数,然后存放在f2.dat文件原有数据后面 3)从f2.dat中读入20个整数,对它们进行从小到 ...

  2. 设文件F1的当前引用计数值为1,先建立F1的符号链接(软链接)文件F2,再建立F1的硬 链接文件F3, 然后删除F1。此时, F2和F3的引用计数值分别是多少?

    [root@VM-24-10-centos test]# touch F1 //创建F1 [root@VM-24-10-centos test]# ls -l F1 //查看F1信息 -rw-r--r ...

  3. 建立两个磁盘文件f1.dat和f2.dat,编程序实现以下工作

    1)从键盘输入20个整数,分别存放在两个磁盘文件中,每个文件中放10个整数 2)从f1.dat读入10个数,然后存放在f2.dat文件原有数据后面 3)从f2.dat中读入20个整数,对它们进行从小到 ...

  4. C++之文件IO操作流

    C++之文件IO操作流 前两节介绍了C++的IO流类库,标准设备IO操作流中部分预定义流对象的成员函数以及IO格式控制.那今天我将继续介绍关于C++中的流操作内容--文件IO操作流fstream.并会 ...

  5. 『Java』文件与IO流

    1. File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 实际存不存在无所谓,这里只是创建一个抽象表示 1.1 构造方法 下面示例项目根 ...

  6. java之文件与IO流及序列化

    目录 文件 java操作文件原理 File类 封装文件为File类对象 常用文件方法 File对象对文件进行操作 File对象对目录进行操作 IO流 IO流的分类 节点流与处理流 处理流特点 字节流与 ...

  7. C++之 文件IO操作流

    关于C++中的流操作内容--文件IO操作流fstream.并会着重讲解C++是如何对文件进行操作的. 文件指存放在外部介质上的数据的集合.大家都知道操作系统是以文件为单位来对数据进行管理的.因此如果你 ...

  8. ModelFileType:XML、Hdf5、dat等不同模型文件后缀文件的简介、使用方法之详细攻略

    ModelFileType:XML.Hdf5.dat等不同模型文件后缀文件的简介.使用方法之详细攻略 目录 一.XML文件 XML简介 XML使用方法 二.HDF5文件 HDF5简介 HDF5常见文件

  9. C++文件流:myfstream,fstream,文件读写,随机文件读写【C++文件流】(59)

    文件流 myfstream fstream Test myfstream fstream 流对象的定义 流对象关联文件 open 函数 打开方式 关闭流对象 文件读写 读写文本文件 读写接口 读一字/ ...

最新文章

  1. 某口腔app发现了不友善词汇(f*ckMobile)
  2. 科研经验2:云协作建立实验室工作总结和内部资料共享平台
  3. 大数据技术在传统企业信息化的应用
  4. linux系统下springboot jar方式启动后允许后台运行
  5. pytorch实现人脸识别_一步一步带你完成深度学习与对象检测之人脸识别
  6. 【转】pacs定位线_C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
  7. 利用OpenCV抠图技术实现影视中“隐身”特效
  8. HTML页面之间跳转与传值(JS代码)
  9. qq发文件大小上限_微信又出新功能!网友:终于不用转QQ了
  10. CentOS_6配置163网络yum源
  11. php公众号开发 点菜,微信公众号点餐系统怎么弄 微信点餐系统怎么开发
  12. MyBatis核心流程三大阶段之初始化阶段
  13. 学生:无效文件.dsn问题
  14. 借助高德LBS开放平台打造属于国人的LBS+AR游戏
  15. 微信带参二维码数据解析
  16. html style属性的用法
  17. C盘爆满,电脑卡顿,笔记本电脑一键重置,让电脑运行重新变快!
  18. java模拟交通信号灯_java 多线程交通信号灯模拟过程详解
  19. 思路如此简单的购买水果问题
  20. Riak - 安装运维篇(1)

热门文章

  1. C#发起钉钉审批实例,表格明细 FormComponentValues_的格式该如何传递的问题
  2. ctfshow-超级玛丽
  3. 图层样式和混合模式—制作美国队长盾牌
  4. 关于JavaStream的一些小练习
  5. java_web学习(四) Date的理解与应用
  6. 世界云计算机公司,2019年全球云计算企业排行榜TOP50(附榜单)
  7. matlab 断点 每次重新,matlab程序怎样从中断点重新开始运行?
  8. Linux SDIO WIFI Marvell8801/Marvell88w8801(一) --- 代码及文档介绍
  9. 制造企业产品成本核算功能设计实例
  10. 跨境电商不得不留意的4个新趋势