栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++学习笔记06--IO

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++学习笔记06--IO

01 IOstream

输入/输出库 - cppreference.comhttps://zh.cppreference.com/w/cpp/io

Iostream采用流式I/O而非记录的I/O,但是可以在此基础上引入结构信息.

所要处理的主要问题:

 1.表示形式的变化:使用格式化(输出)/解析(输入)在数据内部表示与字符序列间转换.

 2.与外部设备的通信:针对不同的外部设备(终端, 文件, 内存)引入不同的处理逻辑

相关操作:

        1格式化/解析-----int x=100   将100存入内存中

        2缓存--------将内存的100读入缓存区

        3编码转换---------使用UTF-8变长编码

        4传输------------传输到外部设备

采用模板来封装字符特性  采用继承来封装设备特性

----常用的类型实际上是类模板实例化的结果

int x=99;
float y=3.14  将x y写入内存

cout< 
02输入与输出 

输入与输出分为格式化与非格式化两类

非格式化I/O:  不涉及数据表现形式的变化

        常用输入函数:get/read/getline/gcount   put  write

格式化IO:使用移位操作符来进行输入>>   输出<<

        -C++可以通过操作符重载来支持內建数据类型的格式化I/O

        -可以通过重载操作符来支持自定义类型的格式化I/O

格式控制:

        可接受位掩码类型showpos (positive正号)  字符类型fill     取值相对随意width 的格式化参数

        其中width方法触发后被重置        

    char x='0';
    std::cout.setf(std::ios_base::showpos);  显示正号
    std::cout.width(10);   占10个字符
    std::cout.fill('.');    前面9个字符用.填充
    std::cout<(x);
    std::cout<(x);

    std::cout< 

操纵符:

-简化格式化参数的设置

-触发实际的插入与提取操作

#include
char x='1';
int y=static_cast(x);
std::cout< 

提取会放松对格式的限制  

int x;  cin>>x; cout<

提取C风格的字符串要小心内存越界

char x[5]; std::cin>>x;  cout<

03文件与内存操作 文件流

basic_ifstream(输入)  basic_ofstream(输出) basic_fstream(输入+输出)

文件流可以出于 打开和关闭 两种状态 出于打开状态时无法再次打开  只有打开才能输入输出

#include
#include
int main()
{

std::ofstream outFile ("My_File");
//std::ofstream outFile;
//outFile.open("My_File");

outFile<<"Hellon";  输出到文件  调用析构函数自动关闭文件流

//outFile.close(); 手动关闭文件流

std::ifstream inFile("My_File");
std::string x;
inFile>>x;   输入x
std::cout< 

文件流的打开模式:

-每种文件流都有缺省的打开方式

-binary能禁止系统特定的转换

-避免意义不明确的流使用方式  ofstream+in  ifstream+out

in        打开以供读取

out     打开以供写入

ate      表示起始位置位于文件尾部

app      附加文件  总是向文件尾部写入

trunc    截断文件   删除文件内容

binary   二进制模式

std::ofstream outFile("My_file",std::ios_base::out)

组合方式:  位或  |

std::ofstream outFile("My_file",std::ios_base::out|std::ios_base::ate)
内存流

basic_istringstream(输入)  basic_ostringstream(输出) basic_stringstream(输入+输出)

--打开模式:  in/out/ate/app   无binary   trunc

--使用str()方法获取底层对应的字符串  避免使用str().c_str()的形式获取C风格字符串

#include
#include
int main()
{
    std::ostringstream obj;  定义输出流
    obj<<1234;  将1234写入内存流
    std::string res=obj.str();  获取内存流的字符串
    std::cout<>x;   和cin>>x差不多
    std::cout< 
#include
#include
int main()
{
    std::string x;
    x+="Hello";
    x+="World";
    x+="Hello";
    x+="World";
    x+="Hello";
    x+="World";
    std::cout< 
04流的状态定位同步 
流的状态 

iostate:

        -failbit     badbit   eofbit    goodbit

位掩码类型:

        iostate     --char类型 1个字节 8位

        badbit      --0000,0001    不可恢复的流错误

        failbit       --0000,0010        输入输出操作失败

        eofbit         --0000,0100        输入序列抵达文件尾部

        goodbit        --0000,0000        无错误

检测流的状态:

        good() /fail() /bad() /eof()  方法

int x;
cin>>x;
cout<(std::cin)< 

注意区分:fail与eof

通常只要流出于某种错误状态时,插入提取操作不会生效

复位流:

        -clear  设置流的状态为具体值   缺省为goodbit

        -setstate 将某个状态附加到现有流的状态上

int x;
cin>>x;
std::cout< 
流的定位 

获取流的位置;

-tellg()  /  tellp()  用于获取输入  输出流位置  (pos_type类型)

    std::ostringstream s;  //内存输出流
    std::cout< 

设置流位置:

        seekg()  / seekp()  用于设置输入/ 输出流的位置

-设置绝对位置: 传入pos_type()进行设置

-设置相对位置:通过偏移量+流位置符号设置

    std::string str="Hello, world";
    std::istringstream in(str);//内存输入流
    std::string word1,word2;
    in>>word1;
    in.seekg(0);//设置输入流的绝对位置为0
    in>>word2;
    std::cout< 
流的同步 

基于flush()  /sync()   /unitbuf  的同步

-flush()   用于输出流同步   刷新 缓冲区

-sync()   用于输入流同步   实现逻辑由编译器所定义

-输出流可以通过unitbuf()来保证每次输出后自动同步

      cerr 无缓冲区  用unitbuf实现及时反应信息到终端

基于绑定(tie)的同步

输入输出流可以绑定到一个输出流上,这样每次输入/输出前可以刷新输出流的缓冲区

例如: cin绑定到了cout上

    std::cout<<"What's your name?n"
    std::string name;
    std::cin>>name;    cin绑定到cout  故每次cin之前都会刷新cout的缓冲区

    std::cout<<"What's your name?"<>name;

与C语言标准IO库的同步:

        缺省情况下,C++的输入输出操作会与C的输入输出函数同步

        可以通过sync_with_stdio关闭该同步

std::ios::sync_with_stdio(false);
std::cout<<"an";
std::printf("bn");
std::cout<<"cn";  
                    结果可能为  b a c  a一定在c前

持续更新.............................

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965500.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号