C++ primer plus random.cpp

  1 // random.cpp -- random access to a binary file
  2 #include <iostream>     // not required by most systems
  3 #include <fstream>
  4 #include <iomanip>
  5 #include <cstdlib>      // (or stdlib.h) for exit()
  6 const int LIM = 20;
  7 struct planet
  8 {
  9     char name[LIM];      // name of planet
 10     double population;  // its population
 11     double g;           // its acceleration of gravity
 12 };
 13
 14 const char * file = "planet.dat";  // ASSUMED TO EXIST (binary.cpp example)
 15 inline void eatline() { while (std::cin.get() != ‘\n‘) continue; }      //内联函数,编译的时候在调用的地方替换代码
 16                                                                         //用来解决函数调用的效率问题
 17
 18 int main()
 19 {
 20     using namespace std;  //在主函数使用标准程序库的命名空间
 21     planet pl;
 22     cout << fixed;        //数字定点形式输出
 23
 24 // show initial contents
 25     fstream finout;         //建立文件流,名字叫做 finout
 26     finout.open(file,
 27                 ios_base::in | ios_base::out | ios_base::binary);  /*调用finout子函数open,ios_base::in ,ios_base::out使用输入输出,i
 28                                                                         os_base::binary表示用二进制操作文件数据 */
 29     //NOTE: Some Unix systems require omitting | ios::binary
 30     int ct = 0;
 31     if (finout.is_open())    //finout.is_open()返回整数表示打开文件是否成功
 32     {
 33         finout.seekg(0);    // 将文件指针定位于文件的其实位置0(第一个字符), FileNam.seekg(Num);
 34         cout << "Here are the current contents of the "
 35              << file << " file:\n";
 36
 37         /*finout.read读取文件,并都转化字符输出(原来为二进制)
 38              FileName.read( (Type*) &struct,sizeof) */
 39         while (finout.read( (char *) &pl, sizeof pl))
 40         {
 41             cout << ct++ << ": " << setw(LIM) << pl.name << ": "
 42                  << setprecision(0) << setw(12) << pl.population
 43                  << setprecision(2) << setw(6) << pl.g << endl;
 44         }
 45         if (finout.eof())  //到达文件尾清除错误信息
 46             finout.clear(); // clear eof flag
 47         else
 48         {
 49             cerr << "Error in reading " << file << ".\n";
 50             exit(EXIT_FAILURE);
 51         }
 52     }
 53     else
 54     {
 55         cerr << file << " could not be opened -- bye.\n";
 56         exit(EXIT_FAILURE);
 57     }
 58
 59 // change a record
 60     cout << "Enter the record number you wish to change: ";
 61     long rec;
 62     cin >> rec;
 63     eatline();              // 吸收换行之前的输入  用于输入字符或者下次要输入字符的时候
 64     if (rec < 0 || rec >= ct)
 65     {
 66         cerr << "Invalid record number -- bye\n";
 67         exit(EXIT_FAILURE);
 68     }
 69     streampos place = rec * sizeof pl;  // 文件指针位置的数据类型  place = rec * sizeof pl 将place指向一个固定位置
 70     finout.seekg(place);    // random access
 71     if (finout.fail())
 72     {
 73         cerr << "Error on attempted seek\n";
 74         exit(EXIT_FAILURE);
 75     }
 76
 77     finout.read((char *) &pl, sizeof pl);     //输出之前要先打开文件
 78     cout << "Your selection:\n";
 79     cout << rec << ": " << setw(LIM) << pl.name << ": "
 80          << setprecision(0) << setw(12) << pl.population
 81          << setprecision(2) << setw(6) << pl.g << endl;
 82     if (finout.eof() )
 83         finout.clear();     // clear eof flag
 84
 85     cout << "Enter planet name: ";
 86     cin.get(pl.name, LIM);              //读入字符:cin.get(Name,sizeof(Type) )
 87     eatline();
 88     cout << "Enter planetary population: ";
 89     cin >> pl.population;
 90     eatline();
 91     cout << "Enter planet‘s acceleration of gravity: ";
 92     cin >> pl.g;
 93     finout.seekp(place);    // 对文件进行操作后指针会变化 重新定位指针
 94     finout.write((char *) &pl, sizeof pl) << flush;  //防止程序中断来不及送出数据   <<flush
 95     if (finout.fail())
 96     {
 97         cerr << "Error on attempted write\n";
 98         exit(EXIT_FAILURE);
 99     }
100
101 // show revised file
102     ct = 0;
103     finout.seekg(0);            // 接下来输出全部内容,将指针定位与开始位置
104     cout << "Here are the new contents of the " << file
105          << " file:\n";
106     while (finout.read((char *) &pl, sizeof pl))
107     {
108         cout << ct++ << ": " << setw(LIM) << pl.name << ": "
109              << setprecision(0) << setw(12) << pl.population
110              << setprecision(2) << setw(6) << pl.g << endl;
111     }
112     finout.close();      //关闭文件
113     cout << "Done.\n";
114 // keeping output window open
115     // cin.clear();
116     // eatline();
117     // cin.get();
118     return 0;
119 }
时间: 2024-10-23 12:33:01

C++ primer plus random.cpp的相关文章

C++自学笔记_复制构造函数_《C++ Primer》

在内置数据类型中,一般可以用一个变量初始化另一个变量.同样,对于类类型的对象,也可以用一个对象初始化另一个对象,编译器会合成一个复制构造函数. #include <iostream> using namespace std; class Point{ public: Point(int x=0,int y=0):xPos(x),yPos(y){} void printPoint(){ cout<<"xPos:"<<xPos<<endl;

《算法导论》 调用RANDOM(0,1),实现RANDOM(a,b)的过程

描述RANDOM(a,b)的过程的一种实现,它只调用RANDOM(0,1).作为a和b的函数,你的程序的期望运行时间是多少?(RANDOM(0,1)以等概率输出0或者1,RANDOM(a,b)以等概率输出[a,b]之间的数(整数)) 要RANDOM(a,b)等概率输出[a,b]之间的数,只要等概率得到[0,b-a]之间的一个数即可.既然可以通过RANDOM(0,1)得到1或者0,这时候就能等概率把[0,b-a]区间划分成更小的区间,假设当得到1时区间缩小为[(b-a)/2,b-a],0时为[0,

【E2LSH源码分析】E2LSH源码综述及主要数据结构

上一小节,我们对p稳定分布LSH的基本原理进行了介绍(http://blog.csdn.net/jasonding1354/article/details/38237353),在接下来的博文中,我将以E2LSH开源代码为基础,对E2LSH的源码进行注解学习,从而为掌握LSH的基本原理以及未来对相似性搜索的扩展学习打下基础. 1.代码概况 E2LSH的核心代码可以分为3部分: LocalitySensitiveHashing.cpp--主要包含基于LSH的RNN(R-near neighbor)数

CentOS 7 源码安装MySQL 5.6.31

本文部分内容参考我之前在CentOS 6下安装MySQL 5.6 的步骤.http://professor.blog.51cto.com/996189/1695769 系统平台:CentOS 7.2 MySQL版本:mysql-5.6.31 安装方式:源码编译 导航1. 下载源码包 2. 解压源码包.安装依赖包 3. 编译安装mysql 4. 安装后配置,包括CentOS 7服务配置 5. my.cnf配置举例 6. mysqld.service配置举例 1. 下载源码包 wget http:/

NOI2014 DAY2 题解

当天下午3点拿到jcvb现场发来的数据,本地自测100+100+30=230. BUAA成绩60+60+30=150.sad story~ 动物园 zoo 既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]. 偌大的提示:kmp! 思路很简单,求出next数组,你会发现这是一棵树,求出根(0)~i路径上<i/2的元素有多少个. BIT nlogn? 多组数据会被卡.(ok多个log也能过的策爷!人家是策爷!) 我跟dzy说,类似单调栈..反正栈上搞搞就行.

VS2010 ERROR:c1xx fatal error c1083

在VS2010中新建文件夹,然后在文件夹内新建文件polling.cpp,可是在项目中不现实该cpp文件,所以就在在硬盘上将该文件删除,编译报错. >c1xx : fatal error C1083: Cannot open source file: 'polling.cpp': No such file or directory 从VS2010资源管理中新建该文件报错,说该文件已存在. 从硬盘上该文件夹内从新建立该文件,VS2010项目中仍不现实该文件.但是可以编译通过. 解决方法:从硬盘上删

ubuntu下安装程序的五种方法

在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. 一.apt-get方法 使用apt-get install来安装应用程序算是最常见的一种安装方法了,比如我要安装build-essential这个软件,使用以下,他会帮我把所有的依赖包都一起安装了. sudo apt-get install build-essential 执行上述命令以后,我们可以看到一下信息,The foll

第 8 章

8.1 #include <iostream> using namespace std; istream& func(istream &is) { std::string buf; while (is >> buf) std::cout << buf << std::endl; is.clear(); return is; } int main() { cout << "请输入一些整数,按 Ctrl+Z 结束"

随机数据生成与对拍

# 随机数据生成与对拍 引言 在漫长的\(OI\)生涯中,你肯定遇到过这些情况 在OI赛制下,你写了一份你自认为是正解的代码,但是你不确定自己是否考虑到了所有的细节,你不敢轻易提交 对于有些无法获得数据的题目,你不知道自己错在了哪里 对于能够获得数据的题目,你拿到的数据都是上万级别的数据,难以\(Debug\). 这时候,我们就可以试试随机数据生成与对拍` 什么是随机数据生成? 顾名思义,就是针对我们的需求生成随机的数据.比如生成随机的整数序列,生成随机的树,生成随机的图. 什么是对拍? 对拍说