c++输入输出文件操作stream

news2024/11/28 13:55:11

系列文章目录

C++ IO库


文章目录

  • 系列文章目录
  • 前言
  • 一、文件IO
    • 概述
    • cout
    • cin
      • 其他istream类方法
  • 文件输入和输出
  • 内核格式化
  • 总结


前言


一、文件IO

概述

c++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节:输出时,程序将字节流插入到输出流中。

在这里插入图片描述
一般输入和输出都有缓冲区。

C++程序通常在用户按下回车键时刷新输入缓冲区。

cin: 标准输入流
cout: 标准输出流
如果输出被重定向到文件,则标准错误流依然会被输出到屏幕
cerr: 标准错误流,无缓冲区
clog: 标准错误流,有缓冲区

cout

ostream类将输出转化为字符字节流

put() 显示字符
 cout.put(‘W’).put(65.1);
write() 显示字符串
 cout.write(“abcd”, 2).write(“ab”, 9);
 long val = 234234; cout.write((char*)&val, sizeof(long));
 将val内存中的数据作为字节字符输出到屏幕

输出缓冲区
输出缓冲区为512字节或为其整数倍
当输出为磁盘时有缓冲区,当输出为屏幕时会进行优化,也可显示指出刷新输出缓冲区:
cout << flush (刷新输出换出区) << endl(刷新输出换出区并插入换行符); flush(cout)也可

格式化
ostream插入运算符将输入转换成文本输出。

  1. 数字显示方式:dec, hex, oct
  2. 调整字段宽度:cout.width(x)
  3. 填充字符:cout.fill(‘*’)
  4. 设置浮点数的显示精度:cout.precision(2)
  5. 打印末尾的0和小数点
  6. cout.setf(ios_base::uppercase)
    常量含义
    ios_base::boolalpha输入和输出bool值,可以为true或false
    ios_base::showbase对于输出,使用C++基数前缀(0, 0x)
    ios_base::showpoint显示末尾的小数点
    ios_base::uppercase对于16进制输出,使用大写字母,E表示法
    ios_base::showpos在正数前加+
  7. 标准控制符:略
  8. 头文件iomanip

cin

cin 对象将标准输入表示为字节流。

对于如下代码:
 int ele;
 cin >> ele;
假设键入下面的字符:
 -123Z
  运算符将读取字符-123,因为它们都是整数的有效部分。但Z字符不是有效字符,因此输入中最后一个可接受的字符是3。Z将留在输入流中,下一个cin语句将从这里开始读取。与此同时,运算符将字符序列-123转换为一个整数值,并将它付给ele。
  输入有时可能没有满足程序的期望。例如,假设输入的是Zcar,而不是-123Z。在这种情况下,抽取运算符将不会修改ele的值,并返回0(如果istream对象的错误状态被设置,if或while语句将判定该对象为false)。返回值false让程序能够检查输入是否满足要求。

while(cin >> num);

由于输入被缓冲。因此通过键盘输入的第二行在用户按下enter之前,不会被发送给程序。然而,循环在字符Z处停止了对输入的处理,因此它不与任何一种浮点格式匹配。输入与预期格式不匹配反过来将当导致表达式cin>>input的结果为false,因此while循环被终止。

成员描述
eofbit如果到达文件尾,则设置为1
badbit如果流被破坏,则设置为1:例如,文件读取错误
failbit如果输入操作未能读取预期的字符或输出操作没有写入预期的字符,则设置为1
goodbit另一种表示0的方法
good()如果流可以使用(所有的位都被清除),则返回true
eof()如果eofbit被设置,则返回true
bad()如果badbit被设置,则返回true
fail()如果badbit或failbit被设置,则返回true
rdstate()返回流状态
exceptions()返回一个位掩码,指出那些标记导致异常被引发
exceptions(isostate ex)设置那些状态将导致clear()引发异常:例如,如果ex是eofbit,则如果eofbit被设置,clear()将引发异常
clear(iostate s)将流状态设置为s:s的默认值为0(goodbit):如果(restate()& exceptions())!=0, 则引发异常 basic_ios::failure
setstate(iostate s)调用clear(rdstate() | s)。这将设置与s中设置的为对应的流状态为,其他流状态为保持不变

其他istream类方法

int ct = 0;
char ch;
do{
  cin.get(ch);
  cout << ch;
  ct++;
}while(ch != '\n\);
cout << ct << endl;
// 若为下面的则跳过空格
int ct = 0;
char ch;
do{
  cin >> ch;
  cout << ch;
  ct++;
}while(ch != '\n\);
cout << ct << endl;

文件输入和输出

#include <fstream>

ofstream fout("file.name"); // or f.open("xxx");
ifstream fin("file.name");

char ch;
while(fin.get(ch)); // 一次读取一个字符,直到文件结尾,EOF

以默认模式打开文件进行输出将自动把文件的长度阶短为零,这相当于删除已有的内容

流状态

if(fin);  // 打开成功为1,失败为0
if(fin.is_open());  // 可检查“文件模式”是否正确

// 一次打开多个文件
ifstream fin;
fin.open("xxx1");
...
fin.close();
fin.clear();
fin.open("xxx2");
...
fin.close();

文件模式

常量含义
io_base::in打开文件,以便读取
io_base::out打开文件,以便写入
io_base::ate打开文件,并移到文件尾
ios_base::app追加到文件尾
ios_base::trunc如果文件存在,则截短文件
ios_base::binary二进制文件
ofstream.open("xxx", ios_base::out | ios_base::trunc);
ofstream.open("xxx", ios_base::out | ios_base::app);
  1. 文本格式
  2. 二进制文件

以二进制形式写读文件

ofstream fout("planets.dat", ios_base::out | ios_base::app | ios_base::binary);
fout.write( (char*)&pl, sizeof(pl));

ifstream fin("planets.dat", ios_base::in | ios_base::binary);
fin.read((char*)&pl, sizeof(pl);

随机存取: 直接移动(不是依次移动)到文件的任何位置。随机存取常被用于数据库文件,程序维护一个独立的索引文件,该文件指出数据在主数据文件中的位置。

fstream类从iostream类派生,后者基于istream和ostream连个类,因此它继承了它们的方法。它还继承了两个缓冲区,一个用于输入,一个用于输出,并能同步化这两个缓冲区的处理。也就是说当程序读写文件时,它将协调地移动输入缓冲区中的输入指针和输出缓冲区中的输出指针。
读写模式:
finout.open(file, ios_base::in | ios_base::out | ios_base::binary);
seekp ofstream
seekg ifstream
seekp()用于将输出指针移到指定的文件位置。seekg(),原型:
basic_istream<charT, traits>& seekg(off_type, ios_base::seekdir);
basic_istream<charT, traits>& seekg(pos_type);
equal to:
istream& seekg(streamoff, ios_base::seekdir);
istream& seekg(streampos);
  第一个原型定位到离第二个参数指定的文件位置特定距离的位置,第二个原型定位到离文件开头特定距离的位置。
assume fin is a ifstream object:

fin.seekg(30, ios_base::beg);  // 30 bytes beyond the beginning
fin.seekg(-1, ios_base::cur);   // back up one byte
fin.seekg(0, ios_base::end);   // go to the end of the file

将streampos位置看作相对文件开始处的位置(第一个字节编号为0),偏移量
fin.seekg(112);

  如果要检查文件指针的当前位置,则对于输入流,可以使用tellg()方法,对于输出流,可以使用tellp()方法,它们返回streampos。fstream对象的输入输出指针同步。如果使用istream ostream对象则输入输出指针不同步。

打开文件、移到文件开头并显示文件内容:

fstream finout;  // read and write streams
finout.open(file, ios::in | ios::out | ios::binary);
// note: some unix systems require omitting | ios::binary
int ct = 0;
if (finout.is_open()) {
  finout.seekg(0);  // go to beginning
  cout << "Here" << file << "file:\n";
  while(finout.read((char*)&pl, sizeof(pl)){
    cout << ct++ << ": " << setw(LIM) << pl.name << ": "
    << setprecision(0) << setw(12) << pl.population
    << setprecision(2) << setw(6)  << pl.g << endl;
  }
  if (finout.eof()) {  // 读取到文件尾
    finout.clear();    // clear eof flag
  } else {             // 没有读到文件尾,而是其他故障导致
    cerr << "Error in reading" << file << ".\n";
    exit(EXIT_FAILURE);
  }
} else {  // 若文件打开失败
  cerr << file << " could not be opened.\n";
  exit(EXIT_FAILURE);
}

cout << "Enter the record number you wish to change: ";
long rec;
cin >> rec;
eatline();  // get rid of newline
if (rec < 0 || rec >= ct) {
  cerr << "Invalid record number.\n";
  exit(EXIT_FAILURE);
}
streampos place = rec * sizeof pl;  // convert to streampos type
finout.seekg(place);                // random access
finout.read((char*)&pl, sizeof pl);
cout << "Your selec:\n";
cout << rec << ": " << setw(LIM) << pl.name << ": "
     << setprecision(0) << setw(12) << pl.population
     << setprecision(2) << setw(6)  << pl.g << endl;
if (finout.eof()) finout.clear();
cout << "Enter planet name: ";
cin.get(pl.name, LIM);
eatline();
cout << "Enter population: ";
cin >> pl.population;
cout << "Enter planet's acceleration of gravity: ";
cin >> pl.g;
finout.seekp(place);
finout.write((char*)&pl, sizeof pl) << flush;  // 刷新输出

if (finout.fail()){
  cerr << "Error on attempted write\n";
  exit(EXIT_FAILURE);
}

stdio stddef stdlib unistd

使用临时文件
#include
char* tmpnam(char* pszName);
生成临时文件名
tmpnam()函数创建一个临时文件名,将它放在pszName指向的C-风格字符串中。常量L_tmpnam和TMP_MAX (二者都是在cstdio中定义的)限制了文件名包含的字符数以及在确保当前目录中不生成重复文件名的情况下可被调用的最多次数

内核格式化

  iostream族支持程序与中断之间的I/O,而fstream族使用相同的接口提供程序和文件之间的I/O。C++库还提供了sstream族,它们使用相同的接口提供程序和string对象之间的I/O。也就是说,可以使用于cout 的ostream方法将格式化信息写入到string对象中,并使用istream方法(如getline())来读取string对象中的信息。读取string对象中格式化信息或将格式化信息写入到string对象中被称为内核格式化(incore formatting)。

#include <iostream>
#include <sstream>
#include <string>

int main()
{
  using namespace std;
  ostringstream outstr;  // manages a string stream
  string hdisk;
  cout << "What's the name of your hard disk? ";
  getline(cin, hdisk);   // getline
  int cap;
  cout << "What's its capacity in GB? ";
  cin >> cap;
  // write formatted information to string stream
  outstr << "The hard disk " << hdisk << " has a capacity of "
  << cap << " gigabytes.\n";
  string result = outstr.str();  // save result
  cout << result;                // show contents
}
...
string lit = "it was a dark and storm day";
istringstream instr(lit);  // use buf for input
string word;
while(instr >> word)
  cout << word << endl;

总结

get() 单字符输入
getline() 字符串输入

seekg()和seekp()函数提供对文件的随机存取。这些类方法使得能够将文件指针放置到相对于文件开头、文件尾和当前位置的某个位置。tellg()和tellp()方法报告当前的文件位置。

获取文件大小

ifstream fin("planets.dat", ios::in | ios::binary);
fin.seekg(0, ios::end);
unsigned long long pos = fin.tellg();
cout << pos << endl;

random.cpp


#include <iostream>
#include <fstream>
#include <iomanip>  // 格式化输出
#include <cstdlib>  // for exit

using namespace std;

const int LIM = 20;

struct planet
{
  char name[LIM];
  double population;
  double g;
};

const char* file = "planets.dat";
inline void eatline()
{
  while (cin.get() != '\n');
}

int main()
{
  planet pl;
  cout << fixed;

  fstream finout;
  finout.open(file, ios::in | ios::out | ios::binary);
  int cnt = 0;
  if (finout.is_open()) {
    finout.seekg(0);  // go to beginning
    cout << "Here, contents " << file << " file:\n";
    while (finout.read((char*)&pl, sizeof pl)) {
      cout << cnt++ << ": " << setw(LIM) << pl.name << ": "
      << setprecision(0) << setw(12) << pl.population
      << setprecision(2) << setw(6) << pl.g << endl;
    }
    if (finout.eof()) {
      finout.clear();
    } else {
      cerr << "Error in reading " << file << ".\n";
      exit(EXIT_FAILURE);
    }
  } else {
    cerr << file << " could not be opened.\n";
    exit(EXIT_FAILURE);
  }
  // change a record
  cout << "Enter the record number you wish to change: ";
  long rec;
  cin >> rec;
  eatline();
  if (rec < 0 || rec >= cnt) {
    cerr << "Invalid record number.\n";
    exit(EXIT_FAILURE);
  }
  streampos place = rec * sizeof pl;
  finout.seekg(place);
  if (finout.fail()) {
    cerr << "Error on attempted seek\n";
    exit(EXIT_FAILURE);
  }
  finout.read((char*)&pl, sizeof pl);
  cout << "Your selection:\n";
  cout << rec << ": " << setw(LIM) << pl.name << ": "
      <<  setprecision(0) << setw(12) << pl.population
      <<  setprecision(2) << setw(6) << pl.g << endl;
  if (finout.eof()) {
    finout.clear();
  }

  cout << "Enter name: ";
  cin.get(pl.name, LIM);
  eatline();
  cout << "Enter popu: ";
  cin >> pl.population;
  cout << "Enter g: ";
  cin >> pl.g;
  finout.seekp(place);
  finout.write((char*)&pl, sizeof pl) << flush;
  if (finout.fail()) {
    cerr << "Error\n";
    exit(EXIT_FAILURE);
  }
  // show revised file
  cnt = 0;
  finout.seekg(0);  // goto beginning of file
  cout << "Here " << file << " file:\n";
  while (finout.read((char*)&pl, sizeof pl)) {
    cout << cnt++ << ": " << setw(LIM) << pl.name << ": "
        <<  setprecision(0) << setw(12) << pl.population
        <<  setprecision(2) << setw(6) << pl.g << endl;
  }
  finout.close();
  cout << "Done.\n";
}

writedat.cpp

#include <iostream>
#include <fstream>
#include <iomanip>  // 格式化输出
#include <cstdlib>  // for exit

const int LIM = 20;

struct planet
{
  char name[LIM];
  double population;
  double g;
};

int main()
{
  using namespace std;
  ofstream fout("planets.dat", ios::out | ios::binary);
  if (!fout) {
    return 0;
  }
  planet p1 = {"earth", 1000, 9.80001};
  planet p2 = {"mars", 34234, 4.555};
  planet p3 = {"moon", 45, 3.55};
  fout.seekp(0);
  fout.write((char*)&p1, sizeof p1);
  fout.write((char*)&p2, sizeof p2);
  fout.write((char*)&p3, sizeof p3);
  fout.close();
  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot+ssm+java校园二手物品交易系统vxkyj

样需要经过市场调研&#xff0c;需求分析&#xff0c;概要设计&#xff0c;详细设计&#xff0c;编码&#xff0c;测试这些步骤&#xff0c;基于Java语言、Jsp技术设计并实现了校园二手物品交易系统。系统主要包括个人中心、商家管理、用户管理、商品分类管理、商品信息管理、商…

中间件SOME/IP简述

SOME/IP SOME/IP 不是广义上的中间件&#xff0c;严格的来讲它是一种通信协议&#xff0c;但中间件这个概念太模糊了&#xff0c;所以我们也一般称 SOME/IP 为通信中间件。 SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩…

调用华为API实现身份证识别

调用华为API实现身份证识别 1、作者介绍2、调用华为API实现身份证识别2.1 算法介绍2.1.1OCR简介2.1.2身份证识别原理2.1.3身份证识别应用场景 2.2 调用华为API流程 3、代码实现3.1安装相关的包3.2代码复现3.3实验结果 1、作者介绍 雷千龙&#xff0c;男&#xff0c;西安工程大…

Spring Boot如何实现配置文件的自动加载和刷新?

Spring Boot如何实现配置文件的自动加载和刷新&#xff1f; 在使用Spring Boot开发应用程序时&#xff0c;配置文件是非常重要的组成部分。在不同的环境中&#xff0c;我们可能需要使用不同的配置文件&#xff0c;例如在开发、测试和生产环境中使用不同的配置文件。而且&#…

功能测试转到自动化测试,我的测试之路“狂飙”~20k...

前言 Python自动化测试&#xff1a;Python自动化测试&#xff0c;7天练完这60个实战项目&#xff0c;年薪过35w。 手动功能测试人员应该权衡测试自动化相对于功能测试的好处&#xff0c;并且即可开始行动。现在随着测试行业的发展&#xff0c;自动化测试已经成为每个测试人的标…

nodejs+vue大学生招聘网站应聘系统设计与实现5b14b

目前&#xff0c;伴随着Internet技术的日益成熟&#xff0c;互联网需要提供更多的服务&#xff0c;发达国家已形成以信息技术为核心&#xff0c;招聘网站支撑的现代化招聘公司技术格局。这便是今天为大家所熟悉的管理信息系统,网络发展为招聘网站实现信息化、自动化、智能化和集…

牛客小白月赛73DE

问题很好转化&#xff0c;但是对区间的处理没把握好&#xff0c;一直在纠结怎么o&#xff08;n&#xff09; 一开始想到二分了&#xff0c;但是没细想&#xff0c;结果看了讲解发现&#xff0c;其实就是一个前缀数组上对区间的查询的操作&#xff0c;以后再遇到此类问题直接向…

Git提交提交代码报错 Push failed unable to access

目录 场景 环境&#xff1a; Git配置 场景 Push failed unable to access https://github.com/1790753131/remotRepository3.git/: Failed to connect to github.com port 443 after 21114 ms: Couldnt connect to server Push failed unable to ac…

计算节点与存储设备是如何连接的?

本文是《数据存储通识课》合集的一部分,本合集希望通过一系列文章科普数据存储相关技术内容。同时,本系列文章不仅仅是科普,还会进行有深度解析,理论结合实现,从代码实现层面进行剖析。欢迎关注“数据存储张”,老张是深耕存储十几载,就业于存储No1公司的资深工程师。 无…

Keil 5 MDK 发律师函警告了,如何用STCubeIDE开发标准库的程序(STM32F103C8T6为例)

用STCubeIDE进行标准库开发 1、CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE 2、CubeIDE下载 点击上面的链接&#xff0c;登录即可下载 3、搭建Demo工程 新建一个工作空间 创建一个工程 选择芯片-STM32F103C8T6 填写工程信息 添加标准库到工程 标…

【数据结构与算法】图论及其相关算法

文章目录 图的基本介绍图的表示方式邻接矩阵邻接表 图的深度优先遍历(DFS)概述实现步骤代码实现 图的广度优先遍历(BFS)概述实现步骤代码实现 图的常用代码汇总最小生成树算法普里姆&#xff08;Prim&#xff09;算法算法实践 克鲁斯卡尔&#xff08;Kruskal&#xff09;算法并…

西南交通大学智能监测 培训课程练习2

2023.05.27培训 task1&#xff1a;spring、springboot task2&#xff1a;mybatis 目录 一、使用IDEA创建工程 1.1新建 ​编辑 1.2选择Maven 1.3创建包 二、添加相关依赖 2.1添加依赖 2.2更新Maven 三、配置application.yaml文件 四、相关注解的使用和理解 4.1Componen…

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原22H2版本

华硕天选3FX507ZC原装Windows11原厂预装系统工厂模式恢复安装带ASUSRecevory一键还原 文件地址&#xff1a;https://pan.baidu.com/s/1snKOsH3OMl3GZLqeAf-GLA?pwd8888 华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件 需准备一个16G左右空u盘进行…

倒置字符串、猜名次、猜凶手、杨辉三角

目录 例一&#xff1a;倒置字符串 例二&#xff1a;猜名次 例三&#xff1a;猜凶手 例四&#xff1a;杨辉三角 方法一 方法二 例一&#xff1a;倒置字符串 首先我们先来看一下题目具体要求 再来看一下我们所需要的效果 这里呢&#xff0c;博主给出两种思路&#xff0c;…

docker构建镜像上传到DockerHub

docker构建镜像上传到DockerHub DockerHub注册账号 DockerHub网址: https://hub.docker.com/ 注册 登录 安装docker docker宿主机环境 centos7 参考网址: https://yeasy.gitbook.io/docker_practice/install/centos 测试 docker 是否安装好 docker -v登录docker 登录 dock…

自动化测试3:Junit单元测试框架

目录 1.相关技术 1.1注解 1.1.1Test 1.1.2Disables 忽略 1.1.3BeforeAll AfterAll 1.1.4BeforeEach AfterEach 1.2参数化 1.2.1单参数 1.2.2多参数 1.2.3CSV获取参数 1.2.4方法获取参数 1.3运行顺序 1.3.1问题 1.3.2按指定顺序执行 1.3.3随机执行 1.4.断言 2.测…

webpack的使用

一、什么是webpack&#xff1f; webpack是一个前端构建工具&#xff0c;目前比较主流的构建工具&#xff0c;自定义的模块比较多。 二、应用场景 vue、react、angular 都可以通过webpack构建全部可供访问的页面数量不超过500个 三、安装 通过npm方式在项目根目录下执行命令…

spring官网guide案例直接运行

spring官网guide案例可以直接运行 spring guide 的案例基本包含 spring 以及 springboot 很多功能的案例 具体网址: https://spring.io/guides 我们使用 GitHub CodeSpaces 或者 GitPod 甚至不需要 git clone 代码到本地 , 可以直接在线运行 GitHub CodeSpacesGitPod 说明:…

SpringBoot 如何实现文件上传和下载

当今Web应用程序通常需要支持文件上传和下载功能&#xff0c;Spring Boot提供了简单且易于使用的方式来实现这些功能。在本篇文章中&#xff0c;我们将介绍Spring Boot如何实现文件上传和下载&#xff0c;同时提供相应的代码示例。 文件上传 Spring Boot提供了Multipart文件上…

Java 集合 - Map 接口

文章目录 1.概述2.常用 API3.遍历 Map 集合4.HashMap 和 Hashtable5.LinkedHashMap6.TreeMap7.Properties8.Set 集合与 Map 集合的关系9.总结 1.概述 在日常生活和编程中&#xff0c;我们常常需要处理一种特殊的关系&#xff1a;一一对应的关系&#xff0c;如 IP 地址与主机名…