iostream流库

2024-05-26 22:48
文章标签 iostream 流库

本文主要是介绍iostream流库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 在C++的iostream流库中,存在着两个基本部分。分别是:

    1. 流:C++把输入和输出看作字节流。输入时,程序从输出流中抽取字节;输出时,程序将字节插入到输出流中。流充当了程序和流源或者流目标之间的桥梁。

    2. 缓冲区:缓冲区是用作中介的内存块,它是将信息从设备传输到程序或者从程序传输到设备的临时存储工具,用以匹配程序和设备之间速度的差距。从设计上说,增加了缓冲区,使的C++的iostream结构更具有扩展性。

    C++的输入输出类图:

    705x273

    下面对C++中各个流类的介绍主要来自于wiki以及网站cplusplus。

    1.1 ios_base

    ios_base类封装了C++标准中的流,并定义了在输入输出中不依赖于读写的数据类型的基本信息和行为,如格式化信息、异常状态、事件回调等。

    在类std::ios_base中,保存了下述关于流的信息:

    格式控制信息的枚举类型fmtflags ,影响到如何解释输入串行的格式、如何生成输出串行的格式,例如整数是用16进制还是10进制表示,浮点数是科学计数法还是定点形式;

    流的状态枚举类型iostate,如数据是否完整、是否到达流的末尾、是否读写失败等;

    流的打开方式枚举类型openmode,如读取、写入、追加、创建时删除原内容、二进制打开、

    流的定位位置枚举类型seekdir,如开始位置、当前位置、结尾位置等。

    流的事件枚举类型event,如“擦除”事件erase_event,改变locale设置事件imbue_event,复制格式事件copyfmt_event。

    流的私有的其它额外保存的数据,为一个long型数组与一个指针数组。

    一个成员类failure,用于作为C++标准中,流输入输出类库抛出的各种异常的基类。

    一个成员类Init,用于封装cout、cin、wcout等8个静态对象的初始化函数。

    成员函数包括:

    格式化:

    1. 读取/设置流的格式

    [cpp]

    fmtflags flags() const;

    fmtflags flags (fmtflags fmtfl);

    fmtflags flags() const;

    fmtflags flags (fmtflags fmtfl);  例子:

    [cpp]

    // modify flags

    #include     // std::cout, std::ios

    int main () {

    std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );

    std::cout.width (10);

    std::cout << 100 << '\n';

    return 0;

    }

    // modify flags

    #include     // std::cout, std::ios

    int main () {

    std::cout.flags ( std::ios::right | std::ios::hex | std::ios::showbase );

    std::cout.width (10);

    std::cout << 100 << '\n';

    return 0;

    }

    2. 设置流的格式,与原有格式合并

    [cpp]

    fmtflags setf (fmtflags fmtfl);

    fmtflags setf (fmtflags fmtfl, fmtflags mask);

    fmtflags setf (fmtflags fmtfl);

    fmtflags setf (fmtflags fmtfl, fmtflags mask);  例子:

    [cpp]

    // modifying flags with setf/unsetf

    #include     // std::cout, std::ios

    int main () {

    std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield

    std::cout.setf ( std::ios::showbase );                 // activate showbase

    std::cout << 100 << '\n';

    std::cout.unsetf ( std::ios::showbase );               // deactivate showbase

    std::cout << 100 << '\n';

    return 0;

    }

    // modifying flags with setf/unsetf

    #include     // std::cout, std::ios

    int main () {

    std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield

    std::cout.setf ( std::ios::showbase );                 // activate showbase

    std::cout << 100 << '\n';

    std::cout.unsetf ( std::ios::showbase );               // deactivate showbase

    std::cout << 100 << '\n';

    return 0;

    }输出:

    Output:

    0x64

    64

    3. 根据参数mask,清除流的格式的某些位(bit)

    [cpp]

    void unsetf (fmtflags mask);

    void unsetf (fmtflags mask);  例子:

    [cpp]

    // modifying flags with setf/unsetf

    #include     // std::cout, std::ios

    int main () {

    std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield

    std::cout.setf ( std::ios::showbase );                 // activate showbase

    std::cout << 100 << '\n';

    std::cout.unsetf ( std::ios::showbase );               // deactivate showbase

    std::cout << 100 << '\n';

    return 0;

    }

    // modifying flags with setf/unsetf

    #include     // std::cout, std::ios

    int main () {

    std::cout.setf ( std::ios::hex, std::ios::basefield ); // set hex as the basefield

    std::cout.setf ( std::ios::showbase );                 // activate showbase

    std::cout << 100 << '\n';

    std::cout.unsetf ( std::ios::showbase );               // deactivate showbase

    std::cout << 100 << '\n';

    return 0;

    }输出:

    0x64

    64

    4. 读取/设置显示浮点数时的精度

    [cpp]

    streamsize precision() const;

    streamsize precision (streamsize prec);

    streamsize precision() const;

    streamsize precision (streamsize prec);  例子:

    [cpp]

    // modify precision

    #include     // std::cout, std::ios

    int main () {

    double f = 3.14159;

    std::cout.unsetf ( std::ios::floatfield );               // floatfield not set

    std::cout.precision(5);

    std::cout << f << '\n';

    std::cout.precision(10);

    std::cout << f << '\n';

    std::cout.setf( std::ios::fixed, std:: ios::floatfield ); // floatfield set to fixed

    std::cout << f << '\n';

    return 0;

    }

    // modify precision

    #include     // std::cout, std::ios

    int main () {

    double f = 3.14159;

    std::cout.unsetf ( std::ios::floatfield );               // floatfield not set

    std::cout.precision(5);

    std::cout << f << '\n';

    std::cout.precision(10);

    std::cout << f << '\n';

    std::cout.setf( std::ios::fixed, std:: ios::floatfield ); // floatfield set to fixed

    std::cout << f << '\n';

    return 0;

    }输出:

    3.1416

    3.14159

    3.1415900000

    5. 读取/设定流的输出数据的显示宽度

    [cpp]

    streamsize width() const;

    streamsize width (streamsize wide);

    streamsize width() const;

    streamsize width (streamsize wide);  例子:

    [cpp]

    // field width

    #include     // std::cout, std::left

    int main () {

    std::cout << 100 << '\n';

    std::cout.width(10);

    std::cout << 100 << '\n';

    std::cout.fill('x');

    std::cout.width(15);

    std::cout << std::left << 100 << '\n';

    return 0;

    }

    // field width

    #include     // std::cout, std::left

    int main () {

    std::cout << 100 << '\n';

    std::cout.width(10);

    std::cout << 100 << '\n';

    std::cout.fill('x');

    std::cout.width(15);

    std::cout << std::left << 100 << '\n';

    return 0;

    }输出:

    100

    100

    100xxxxxxxxxxxx

    语言环境:

    1. 给流设置本地语言环境

    [cpp]

    locale imbue (const locale& loc);

    locale imbue (const locale& loc);  例子:

    [cpp]

    // imbue example

    #include     // std::cout

    #include       // std::locale

    int main()

    {

    std::locale mylocale("");  // get global locale

    std::cout.imbue(mylocale); // imbue global locale

    std::cout << 3.14159 << '\n';

    return 0;

    }

    // imbue example

    #include     // std::cout

    #include       // std::locale

    int main()

    {

    std::locale mylocale("");  // get global locale

    std::cout.imbue(mylocale); // imbue global locale

    std::cout << 3.14159 << '\n';

    return 0;

    }输出:

    3,14159

    2. 获取当前使用语言环境

    [cpp] locale getloc() const;

    locale getloc() const;

    1.2 basic_ios

    basic_ios定义出“与字符类型及其相应字符特性相关”的stream class的共同属性,其中包括清除流状态、设置流状态、拷贝流标志、返回或设置流缓冲区指针、设置本地化相关信息、返回或设置填充字符、字符转换,还包括了stream所用的缓冲器.

    basic_ios在其内部定义了一个指向streambuf的指针。

    [cpp] template

    class basic_ios

    : public ios_base

    {

    //C++标准库封装了一个缓冲区类streambuf,以供输入输出流对象使用。

    //每个标准C++输出输出流对象都包含一个指向streambuf的指针,

    basic_streambuf<_Elem, _Traits>*_Mystrbuf;

    // ....

    }

    template

    class basic_ios

    : public ios_base

    {

    //C++标准库封装了一个缓冲区类streambuf,以供输入输出流对象使用。

    //每个标准C++输出输出流对象都包含一个指向streambuf的指针,

    basic_streambuf<_Elem, _Traits>*_Mystrbuf;

    // ....

    }

这篇关于iostream流库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005804

相关文章

#include <iostream>介绍

在C++编程中,#include <iostream> 是一个非常重要的预处理指令,用于引入输入输出流库。以下是对 #include <iostream> 的详细介绍: 1. 作用 #include <iostream> 指令的主要作用是使程序能够使用标准输入输出流的功能。它包含了定义输入输出流的类和函数,允许程序进行数据的输入和输出操作。 2. 主要功能 引入 <iostream> 后,

c++:C++标准库学习iostream

基础介绍 C程序可以通过__cplusplus符号是否预定义来判断当前是gcc还是g++编译 __cplusplus的值是long int类型的,值表示当前编译程序的C++编译器的版本号。 cout << "__cpulspuls :" << __cplusplus << endl; C++文件名的常用后缀:源文件(.cpp .cxx .cc .c .c++),头文件(.hpp .hx

IOstream基本概念

1.stream对象 c++ I/O由stream完成,所谓stream就是一条数据流,字符序列在其中‘川流不息’。按照面向对象原则,stream是由摸个类定义出来的具有特定性质的对象。输出操作被解读为“数据流入stream” , 输入操作则是“数据流出stream”。另外有一些为标准I/O通道而定义的全局对象。 2.stream类别 class istream 用来定义input str

iostream.h找不到问题

: #include <iostream.h> class Point { public: int x; int y; }; void main() { Point pt; pt.x=5; pt.y=5; cout<<pt.x<<endl<<pt.y<<endl; } 编译错误:    fatal error C1083: 无法打开包括文件:"iostream.h": No such

Qt使用iostream的cout

在QT想使用iostream的cout。 参考以下博客: (转载)Qt中使用cout输出的方法 pro里加上; CONFIG += console 勾选 Run in Terminal clean工程,重新构建 上面是cout的,下面是我的另一个函数的qDebug输出的。

‘iostream‘ file not foundclang(pp_file_not_found)

概要 在 macOS 用 VSCode 打开 test.cpp 文件, 使用 CMake 构建, 生成了 compile_commands.json 看起来也正常。遇到 iostream 头文件画红色波浪线的报错, 也无法跳转。最后查出来是 brew install 了 LLVM 并且(莫名其妙的)放到了 PATH 里导致的。 环境说明 - VSCode 我是使用 clangd, clang

理解C++中#include <iostream>

#include From 《C++ Library reference 概览》, include come from ‘algorithm -> merge -> includes’. From geeksforgeeks, #include is a way of including a standard or user-defined file in the program and

iostream使用时注意事项

标准IO库在3个头文件中定义:iostream是从流中读写,fstream是从文件的读写,而sstream是从字符串中去读写。 IO对象有一个很重要的特点,就是不能复制或者赋值。这意味两点:第一,IO对象不能储存在容器中,第二,形参或者函数的返回值也不能是IO类型。如果需要传递IO对象,则需要使用引用。 IO操作有可能是正确的,也有可能是错误的。错误的IO操作将会导致严重的后果,因此IO可定义了

深入理解 C++ 中的 IO 流【iostream篇】

C++ 中的输入输出流(iostream)是非常重要的一部分,它们提供了与用户交互以及与文件系统进行数据交换的功能。本文将深入探讨 C++ 中的 cin 和 cout,介绍它们的使用方法、缓冲区以及常用的成员函数等相关知识。 1. cin 和 cout 的基本使用 在 C++ 中,cin 和 cout 是标准输入输出流对象,分别用于从标准输入(通常是键盘)读取数据和向标准输出(通常是屏幕)写入

iostream、fstream、sstream、string、vector、unordered_map、stack

iostream 用于输入输出操作,包含了处理标准输入输出流的功能(例如,cin, cout, cerr等)。 #include <iostream>int main() {int number;std::cout << "Enter a number: ";std::cin >> number;std::cout << "You entered: " << number << std::