首页 > 编程语言 >C++输入输出流

C++输入输出流

时间:2023-06-20 21:11:20浏览次数:50  
标签:count std 文件 输入输出 C++ 缓冲区 type

一、输入输出流

  • 三种流:
  1. istream、ostream、iostream 标准输入输出流
  2. ifstream、ofstream、ftream 文件输入输出流
  3. istringstream、ostringstream、stringstream 字符串输入输出流
  • 三种流的关系:

  • 流的状态iostate:

1.badbit  :表示发生系统级的错误,如不可恢复的读写错误。通常情况下一旦 badbit 被置位,流就无法再使用了。
2.failbit :表示发生可恢复的错误,如期望读取一个数值,却读出一个字符等错误。这种问题通常是可以修改的,流还可以继续 
            使用。当到达文件的结束位置时,eofbit和failbit  都会被置位。
3.goodbit :表示流未发生错误。如果 badbit、failbit和eofbit任何一个被置位,则检查流状态的条件会失。
4.eofbit  :表示输入流已经到达文件结束位置。
  • 管理流的状态
//判断流的状态的几种函数。
//若流的badbit置位,则返回true;否则返回false
bool bad() const; 

//若流的failbit或badbit置位,则返回true;
bool fail() const;  

//若流的eofbit置位,则返回true;
bool eof() const;   

//若流处于有效状态,则返回true;
bool good() const;  

//获取流的状态
iostate rdstate() const;  

//设置流的状态
void setstate(iostate state);  
 
//clear的无参版本会复位所有错误标志位*(重置流的状态)
void clear(std::ios_base::iostate state = std::ios_base::goodbit);
  • 流的通用操作
//----以下输入流操作----
//读取一个字符
int_type get();
istream & get(char_type & ch);

//读取一行数据
istream & getline(char_type * s, std::streamsize count, char_type delim ='\n');

//读取count个字节的数据
istream & read(char_type * s, std::streamsize count);

//最多获取count个字节,返回值为实际获取的字节数
std::streamsize readsome(char_type * s, std::streamsize count);

//读取到前count个字符或在读这count个字符进程中遇到delim字符就停止,并把读取的这些东西丢掉
istream & ignore(std::streamsize count = 1, int_type delim = Traits::eof());

//查看输入流中的下一个字符, 但是并不将该字符从输入流中取走,返回该字符
//不会跳过输入流中的空格、回车符; 在输入流已经结束的情况下,返回 EOF。
int_type peek();

//获取当前流中游标所在的位置
pos_type tellg();

// 可选的偏移位置
ios_base::beg   文件开头
ios_base::cur   当前指针位置
ios_base::end   文件结尾位置

//偏移游标的位置
basic_istream & seekg(pos_type pos);
basic_istream & seekg(off_type off, std::ios::seekdir dir);

//----以下为输出流操作----
//往输出流中写入一个字符
ostream & put(char_type ch);

//往输出流中写入count个字符
ostream & write(const char_type * s, std::streamsize count);

//获取当前流中游标所在的位置
pos_type tellp();

//刷新缓冲区
ostream & flush();

//偏移游标的位置
ostream & seekp(pos_type pos);
ostream & seekp(off_type off, std::ios_base::seekdir dir);

二、输入输出缓冲区

  • 缓冲区
    缓冲区是一块内存区,它用在输入输出设备和 CPU 之间,用来缓存数据。它使得低速的输入输出设备和高速的 CPU 能够协调工作,避免低速的输入输出设备占用 CPU ,解放出 CPU ,使其能够高效率工作。

  • 三种缓冲区

  1. 全缓冲:在这种情况下,当填满标准 I/O 缓存后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
  2. 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是键盘输入数据。
  3. 不带缓冲:也就是不进行缓冲,标准出错情况 cerr/stderr 是典型代表,这使得出错信息可以直接尽快地显示出来。
  • 类别
    输入缓冲区:cin。
    输出缓冲区:cout、cerr(非缓冲)\clog(带缓冲)。

  • 输出缓冲区刷新的几种情况:

  1. 程序正常结束(有一个收尾操作就是清空缓冲区);
  2. 缓冲区满(包含正常情况和异常情况);
  3. 使用操纵符显式地刷新输出缓冲区,如: endl(换行)、ends(末尾加上一个空字符)、flush(直接刷新缓冲区);

三、文件I\O

  • 文件的打开模式(openmode)
    in : 输入,文件将允许做读操作;如果文件不存在,打开失败
    out : 输出,文件将允许做写操作;如果文件不存在,则直接创建一个
    app : 追加,写入将始终发生在文件的末尾
    ate : 末尾,写入最初在文件的末尾
    trunc : 截断,如果打开的文件存在,其内容将被丢弃,其大小被截断为零
    binary : 二进制,读取或写入文件的数据为二进制形式

标签:count,std,文件,输入输出,C++,缓冲区,type
From: https://www.cnblogs.com/skycrash/p/17494205.html

相关文章

  • C/C++花卉系统[2023-06-20]
    C/C++花卉系统[2023-06-20]数据结构与算法程序设计花苑1项目要求项目名称-花苑-项目类型-应用软件类项目难度-中等-素材资源-无(../res)使用工具-不限-编译系统-Windows、Linux硬件需求-无-程序语言-不限知识点-结构体/类、树、图、链表、查找、函数、文件操......
  • VS Code C++插件生成的临时文件的目录配置
    VSCodeC++插件生成的临时文件的目录配置默认情况下,每运行一次C++代码,就会生成一次临时文件。默认保存在C盘,可以修改VSCode的配置文件,更改临时文件的生成位置。修改临时文件的生成的目录所在位置。......
  • C++程序设计题[2023-06-20]
    C++程序设计题[2023-06-20]在设计时,同学们可以采用结构化程序设计方法、面向对象程序设计方法同时使用。目录前言I选题1学生成绩管理系统的设计与实现1一、设计要求1选题2运动会成绩管理系统的设计与实现3一、问题描述3二、设计要求3选题3图书管理系统的设计与实现5......
  • C++小案例之音乐播放器
    Common.h:点击查看代码#pragmaonce#include<iostream>#include<string>#include<vector>#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<list>#include<time.h>#include<map>#include<m......
  • C++指针
     #include<iostream>usingnamespacestd;//指针 if(1) { inta=10; intb=20; constint*pi=&a; pi=&b; //const指针可以修改指针,不能修改指向的数据 //*pi=25; //错误表达式必须是可修改的左值 cout<<*pi<<endl; }......
  • C++字符串处理
         #include<iostream>#include<sstream>usingnamespacestd;if(1){inti;stringstreamss_stream;//注意:如果做多次数据转换;必须调用clear()来设置转换模式ss_stream<<"456";ss_stream>>i;//首先将字符串转换为intcout<<i<&......
  • 【UEC++】UE引擎程序设计浅析
    一虚幻引擎C++编程                                        未完待续.........
  • UE5 C++ UPROPERTY宏
    属性声明UPROPERTY([specifier,specifier,...],[meta(key=value,key=value,...)])TypeVariableName;属性说明符声明属性时,属性说明符可被添加到声明,以控制属性与引擎和编辑器诸多方面的相处方式常用说明符VisibleDefaultsOnly//仅在ClassDefaults可见UP......
  • 树状数组详解!(C++_单点/区间查询_单点/区间修改)
    先把这张著名的树状数组结构图摆在最前面,接下来我们就以这张图讲起!       首先图中的A数组就是所谓的原数组,也就是普通的数组形态,C则是我们今天要说的树状数组(可以看出一个树的形状,但其实和树没多大关系)从图中可以明显看到以下几个式子:有点像前缀和不是?但这样还看不出什......
  • C++用纯虚函数实现协议委托的例子
      C++不像其他很多编程语言有接口、委托或者协议的概念,但是利用纯虚函数和C++多重继承的特性,我们也能实现接口、委托或协议要做的事情,下面的通过一个人设置闹钟然后被闹钟唤醒的例子来说明如何在C++中实现委托回调。#include<iostream>#include<unistd.h>usingstd::cout;u......