1.创建一个顺序文件与文件输入(追加)

#include<iostream>

#include<fstream>

#include<string>

using namespace std;

int main()

{

ofstream file; //注意是ofstream而不是ifstream,二者不同,见下

file.open("1.txt", ios::out);//ios::app表示追加;ios::ate可以在文件的任何位置写数据;ios::in表示输入(但是此时文件必须是存在的,而且输入的回逐一替换以前的,但是不会一次性将以前的全部删除);ios::out表示输出(但是会删除已有内容)

if (!file)

{

cerr << "File Open Error !" << endl;

exit(1);

}

cout << "input the account,name,and balance" << endl;

int account;

string name;

double balance;

//当一个指针作为判定条件时,C++将一个空指针视为FALSE,非空为TRUE,这里隐式的调用了cin成员运算符void*;

while (cin >> account >> name >> balance)

{

file << account << ' ' << name << ' ' << balance << endl;

}//最终输入control+Z终止

file.close();//当不需要时 可以显示的调用该函数来减少资源占用

}

2.从顺序文件中读取数据

#include<iostream>

#include<fstream>

#include<string>

#include<iomanip>

using namespace std;

void Print(int account, const string name, double balance)

{

cout << left << setw(10) << account << setw(13) << name << setw(13) << balance << endl;

}

int main()

{

ifstream file("1.txt", ios::in);

if (!file)

{

cerr << "file open error !" << endl;

exit(1);

}

cout << left << setw(10) << "Account" << setw(13) << "Name" << setw(13) << "Balance" << /*fixed << showpoint <<*/ endl;

int account;

string name;

double balance;

while (file >> account >> name >> balance)

{

Print(account, name, balance);

}

return 0;

}

重定位文件定位指针,istream和ostream都提供了成员函数来重定位文件定位指针(文件中下一个被读取或写入的字节号);在istream中,这个成员函数为seekg(),在ostream中为seekp();每个istream对象都有一个读取指针来指出文件中下一个输入的字节号,每个ostream对象都有一个写入指针来指出文件中下一个被输出的字节号;如:file.seekg(0)将定位指针重定位于文件的起始位置,其中还可以指定第二个参数来指定寻找的方向,可以是ios::beg(默认)(相对于流的开始位置进行定位);ios::end(相对于文件的末尾);ios::cur(相对于文件的当前位置)(注意数值代表的是文件开始位置到当前位置的字节数);如:file.seekg(n,ios::cur)

同样的操作可以使用osream中的seekp来实现;

成员函数tellg和tellp分别用于返回当前的“读取”和“写入”指针的位置

3.更新顺序文件:如果要将300  White  0.00数据替换成300  Worthington  0.00 的话,由于Worthington比White多了六个字符,则从“o”之后的字符就会覆盖文件中下一条顺序记录的开头;如果要使用这种方法来更新数据的话就只有用两个文件,先将该数据之前的数据拷贝到新文件中,让后再替换,之后再拷贝该数据之后的数据过去即可

实例:反复读取文件

#include<iostream>

#include<fstream>

#include<iomanip>

#include<string>

#include<stdlib.h>

using namespace std;

enum RequestType {ZERO_BALANCE = 1,CREDIT_BALANCE,DEBIT_BALANCE,END};

int getRequest();

bool shouldDisplay(int, double);

void outputLine(int, const string, double);

int main()

{

//cout << ZERO_BALANCE << " " << CREDIT_BALANCE << " " << DEBIT_BALANCE << " " << END << endl;

ifstream inClientFile("1.txt", ios::in);

if (!inClientFile)

{

cerr << "File Opened Erro !" << endl;

exit(1);

}

int request;

int account;

string name;

double  balance;

request = getRequest();

while (request != END)

{

switch (request)

{

case ZERO_BALANCE:

cout << "\nAccounts With Zero Balance :\n";

break;

case CREDIT_BALANCE:

cout << "\nAccounts With Credit Balance :\n";

break;

case DEBIT_BALANCE:

cout << "\nAccouts With Debit Balance :\n";

break;

}

inClientFile >> account >> name >> balance;

while (!inClientFile.eof()) //返回一个零值,直到文件结束

{

if (shouldDisplay(request,balance))

{

outputLine(account, name, balance);

}

inClientFile >> account >> name >> balance;

}

inClientFile.clear();

inClientFile.seekg(0);

request = getRequest();

}

cout << "End Of Run !" << endl;

return 0;

}

int getRequest()

{

int request;

cout << "\nEnter The  Request :\n"

<< "1-List Accounts Of Zero Balance \n"

<< "2-List Accounts Of Credit Balance\n"

<< "3-List Accounts Of Debit Balance\n"

<< "4-End Of Run !" << endl;

do

{

cout << "\n?";

cin >> request;

} while (request<ZERO_BALANCE && request>END);  //这里的条件不成立,所以只允许输入一次

return request;

}

bool shouldDisplay(int type, double balance)

{

if (type == ZERO_BALANCE && balance == 0)

return true;

if (type == CREDIT_BALANCE  &&balance < 0)

return true;

if (type == DEBIT_BALANCE && balance >0)

return true;

return false;

}

void outputLine(int account, const string name, double balance)

{

cout << left << setw(10) << account << setw(13) << name << setw(13) << balance << endl;

}

4.随机存取文件:

(a):创建随机存取文件

(1)ostream的成员函数write()函数可以从指定位置写入数据;istream中的read()函数可以从指定位置读取字节数据。

(2)write函数使用:file.write(reinterpret_cast<const char *>(&number),sizeof(number))  //实际上reinterpret_cast为强制类型转换,这里write函数要求const char * 类型;但是reinterpret_cast与编译器相关,所以尽量不要使用

对于read函数:file.read(reinterpret_cast<char *>(&number),sizeof(number)),要求char*类型的数据

(3)调用string类的函数将一个string数据写入到定长的char数组中(这也是为了创建随机存取文件),实例:

string lastNameString;

char lastName[15];

int length = lastNameString.size();

lastNameString.copy(lastName, length);

lastName[length] = '\0'; //记住最后还要自己加\0

(4)ofstream outFile("1.txt", ios::out | ios::binary); //ios::binary表示以二进制形式打开文件,如果要写入定长的记录,这是比要的

(5)对于既要读又要写的文件,课可以直接使用(fstream)

ifstream File("1.txt", ios::in | ios::out | ios::binary);

(6)file.clear()//表示复位文件结束指示符,一般在文件读取错误或者用户输入错误时,又要继续使用文件,此时应该调用此函数

C++学习笔记(7)的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. Unity ShaderGraph 截图保存为PNG

    很好用的插件 https://github.com/Cyanilux/ShaderGraphToPNG

  2. linux 笔记 (3)

    $:符号代表一个shell变量. echo:打印输出 *:代表任意字符串 ?:代表单个字符 su:切换用户 grep:在文件中搜索字符串 ^:匹配行首 grep -n '^a' test.txt:匹配 ...

  3. WPF 绘制实时曲线图

    效果图地址:https://www.bilibili.com/video/BV1PN411W7Ut 通过Writeablebitmapex,gdi+,然后渲染到前台image中实现实时绘制曲线图 部分 ...

  4. iSCSI存储协议详解

    iSCSI 存储协议详解 (注意:正确缩写为 iSCSI,全称为 Internet Small Computer System Interface,是一种基于 IP 网络的存储协议.) 1. 什么是 ...

  5. 即视角|元宇宙社交:新瓶旧酒 or 老树新芽?

    即视角Insight共享即构新洞察,共建行业新动能--ZEGO即构科技基于音视频技术领域的多年深耕,综合面向各行业的服务经验,在[即视角]栏目发布即构对行业的洞察.近期我们将聚焦于#元宇宙商业化#话题 ...

  6. 实时语音驱动实现Android端Avatar虚拟人表情表达

    语音驱动虚拟人功能简介 ZEGO Avatar SDK 提供了语音驱动功能,通过声音的声波信息,实时驱动当前虚拟人物的嘴形变化,使得虚拟形象能够和真人一样进行自然的情绪表达. 可广泛应用于社交互动.语 ...

  7. Qt | 在qcustomplot自定义图例项显示方式,实现复选框图例控制曲线可见性

    问题 在使用Qt连接数据库时,出现Driver not loaded报错(这里以Mariadb数据库为例Mysql同理) 指定QMYSQL情况下报错 指定QMARIADB驱动情况下报错 出现原因分析 ...

  8. MyEMS开源能源管理系统核心代码解读017

    MyEMS开源能源管理系统适用于建筑.工厂.商场.医院.园区的电.水.气等能源数据采集.分析.报表,还有光伏.储能.充电桩.微电网.设备控制.故障诊断.工单管理.人工智能优化等可选功能.资深专业团队开 ...

  9. [题解]P3952 [NOIP2017 提高组] 时间复杂度

    P3952 [NOIP2017 提高组] 时间复杂度 我们把循环的嵌套关系看做树形结构,梳理一下\(3\)种情况: 直接跳过当前子树: \(x,y\in\mathbb{N}\),且\(x>y\) ...

  10. [题解]ABC347 C~E

    Portal:https://atcoder.jp/contests/abc347/tasks ABC347只过了\(A,B\),再创新低,...遂来补题 C - Ideal Holidays 题意简 ...