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

系列文章目录

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();
  
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

进攻中型SUV,蔚来/小鹏的智能化「满配」能否撬动需求

251.29万辆&#xff0c;这是2022年中国市场&#xff08;不含进出口&#xff09;乘用车中型SUV交出的答卷&#xff0c;交付量仅次于紧凑型SUV&#xff0c;排名细分市场第二。在这份成绩单中&#xff0c;有几个数字特别醒目。 1、31.64万辆&#xff0c;这是排名这个细分市场交付量…

BFT 最前线 | 张一鸣成立个人基金;马斯克:AI是双刃剑;阿里首席安全科学家离职;卡内基梅隆究团队:解决农业虫卵问题的机器人

文 | BFT机器人 名人动态 CELEBRITY NEWS 01 字节跳动创始人张一鸣 在香港成立个人投资基金 在卸任CEO两年后&#xff0c;字节跳动创始人张一鸣在香港成立了一家个人投资基金。香港公司注册处网站显示&#xff0c;该基金名为Cool River Venture&#xff0c;性质是私人股份有限…

connect reset/timeout/reject 排查

异常排查 问题描述问题处理初步分析http配置即服务整体情况整体排查服务重启gcCPUJVM 暂存疑问点总结启动参数要配全监控体系健全科学使用jar包降配参数是参数得动态变 问题描述 最初出现的时候&#xff0c;是在每天的早上8-10这个时间范围内&#xff0c;服务A上的有一个接口时…

电源方案对比

电源 1.方案选择&#xff1a;1 LM2596 2 MP1584 3&#xff1a;TPS54301LM25962.MP1584&#xff1a;3.TPS5430 2.1输出2A电流的纹波2.2 输出3A电流的纹波3.动态响应4.发热5.电源转换效率6.综合指标reference 1.方案选择&#xff1a;1 LM2596 2 MP1584 3&#xff1a;TPS5430 1LM…

开源赋能 普惠未来|XuperCore诚邀您参与2023开放原子全球开源峰会

XuperCore&#xff08;待更名&#xff09;是百度自主研发&#xff0c;拥有完整知识产权的区块链底层技术XuperChain的内核&#xff0c;拥有620多篇区块链核心技术专利&#xff0c;以“高性能”、“开源”为主要设计目标&#xff0c;致力于创建“更快、更通用、更好用”的区块链…

protobuf全局环境搭建

一、安装npm 1.测试是否安装npm 如果未出现npm 不是内部或外部命令&#xff0c;则先安装npm npm是NodeJs的包管理器&#xff08;Node Package Manager&#xff09; 所以我们要安装npm&#xff0c;其实就是安装NodeJs&#xff0c;进入NodeJs官网 下载完成之后&#xff0c;安装…

开发工具---Eclipse 教程Ⅰ

Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。 Eclipse 是 Java 的集成开发环境&#xff08;IDE&#xff09;&#xff0c;当然 Eclipse 也可以作为其他开发语言的集成开发环境&#xff0c;如C&#xff0c;C&#xff0c;PHP&#xff0c;和 Ruby 等。 Eclipse 附带…

劝你别去外包,干了三年,感觉废了一半....

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入杭州某个外包软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

【Android定制】BUILD_AGO_GMS = no 和 BUILD_GMS=no属性

文章目录 概要名词解释细节小结 概要 在安卓底层源码中&#xff0c;有这样的两个属性&#xff0c;这两个第一眼看上去都像是带不带谷歌&#xff0c;BUILD_AGO_GMS no和BUILD_GMSno有什么区别&#xff1f;&#xff1f; 如果带了谷歌&#xff0c;那么这个设备就差不多是国外定…

小程序极速注册认证免300认证费 突破管理员身份只能绑定5个小程序绿色通道

小程序注册账号管理相信大家有时候头都很大&#xff0c;一个身份证号只能绑定5个小程序主管理员。超个5个小程序就得请朋友、请亲戚身份证绑定管理员。有时还得看对方不方便&#xff0c;改个类目改个LOGO都还得管理员扫码。为了满足会员需求同是也满足自己需要&#xff0c;特别…

陌生交友发布动态圈子单聊打招呼群聊app开发

陌生交友发布动态圈子单聊打招呼群聊app开发 功能有&#xff0c;发布圈子&#xff0c;发布动态&#xff0c;查看附近的人&#xff0c;发布活动&#xff0c;实人认证&#xff0c;个人主页&#xff0c;相册查看,单聊&#xff0c;群聊。 即时通讯第三方goeasy接口。 好的&#x…

【nginx】同一接口有时返回500(client_body_temp)

问题描述&#xff1a; 同一个接口&#xff0c;有能正常访问并返回的&#xff0c;有的访问未到服务器直接返回500。 查看nginx日志&#xff08;error.log&#xff09;&#xff0c;发现open() "/nginx/client_body_temp/0000476534" failed (13: Permission denied)报…

Linux——makefile自动化构建工具

一. 前言 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复杂 的功能…

Navicat “1205 - Lock wait timeout exceeded; try restarting transaction“

标题标题&#xff1a;解决Navicat数据库操作报错&#xff1a;1205 - Lock wait timeout exceeded; try restarting transaction 导言&#xff1a; 在使用Navicat进行数据库操作时&#xff0c;有时会遇到错误代码为"1205 - Lock wait timeout exceeded; try restarting t…

论文分享 A ConvNet for the 2020s

摘要 视觉识别的“咆哮的 20 年代”始于 Vision Transformers (ViTs) 的引入&#xff0c;它迅速取代了 ConvNets&#xff0c;成为最先进的图像分类模型。另一方面&#xff0c;vanilla ViT 在应用于对象检测和语义分割等一般计算机视觉任务时面临困难。正是层次化的 Transforme…

蓝奥声核心技术分享——无线同步群控技术

1.技术背景 无线同步群控技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及无线物联网边缘域网络的无线通信与智能控制技术领域&#xff0c;具体主要…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)第三章——AI应用开发

1.具备编程经验 本课程中的示例代码、练习涉及C&C语言、Python语言的如下基础知识&#xff0c;建议您在学习本课程前先学习这部分内容 1.C&C语言 a.变量、基本数据类型、指针、引用、const限定符等 b&#xff0c;字符串和数组 c.表达式&#xff0c;包括赋值运算、条件…

华为OD机试真题 Java 实现【统计匹配的二元组个数】【2023Q2 200分】

一、题目描述 给定两个数组A和B&#xff0c;若数组A的某个元素A[i]与数组B中的某个元素B[j]满足 A[i] B[j]&#xff0c;则寻找到一个值匹配的二元组(i, j)。 请统计在这两个数组A和B中&#xff0c;一共存在多少个这样的二元组。 二、输入描述 第一行输入数组A的长度M&…

python---变量(2)

此处&#xff0c;首次使用“”对a进行设置值&#xff0c;也就是对a的初始化。 后续位置对a使用“”&#xff0c;实际上是对a赋值。 因此两行代码得到的结果显然是不同的&#xff01; 变量的种类 1.整数-int-根据数据大小自动扩容 python中的变量类型不需要显示声明&#…

9:00进去,9:05就出来了,这问的也太变态了···

从外包出来&#xff0c;没想到死在另一家厂子了。 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到5月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推…