【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

引言

C++中的IO流(输入输出流)是程序与外部环境之间进行数据交互的重要手段。通过IO流,程序可以从外部读取数据或将数据输出到外部,实现了程序与用户、其他程序和设备之间的数据传输。C++标准库提供了丰富的IO流类和函数,通过这些类和函数,开发者能够方便地实现各种类型的IO操作。本文将介绍IO流的基本概念和相关类,讲解如何在C++程序中使用IO流实现输入输出操作,并给出相应的示例代码以说明其用法。同时,还将介绍一些常见的IO流操作技巧和使用注意事项,帮助读者更好地掌握和应用C++中的IO流机制。通过学习本文,读者将能够深入理解C++中的IO流,掌握IO流的使用方法,提高程序的输入输出效率和稳定性。

一、C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()printf()

  • scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中
  • printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)

🚨🚨注意宽度输出和精度输出控制

C语言借助了相应的缓冲区来进行输入与输出。如下图所示:

⭕对输入输出缓冲区的理解:

  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序
  2. 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”

二、流是什么

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bitbytepacket )的抽象描述。

C++中的流是一种抽象描述,用于表示数据从一个地方(输入设备)流向另一个地方(输出设备)的过程。它描述了数据以有序连续和具有方向性的方式流动的特性。在C++中,流被比喻为信息从外部输入设备(如键盘)向计算机内部(如内存)输入,或者从内存向外部输出设备(如显示器)输出的过程为了实现这种流动,C++提供了I/O标准类库,其中的每个类都被称为流或流类,用于完成不同方面的输入输出功能。通过使用这些流类,我们可以实现数据的输入和输出操作,实现与外部环境的交互。

🔴C++提供的I/O标准类库

三、C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类

1. C++标准IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。

(1)istream

istream 是输入流的基类,它提供了从外部读取数据的功能。常用的 istream 类有 istream, ifstream(从文件读取)和 istringstream(从字符串读取)。

⭕常用的 istream 函数包括:

  • get():从流中获取下一个字符并返回其 ASCII 值。
  • getline():从流中读取一行文本,并将其存储在指定的字符串变量中。
  • operator>>:从流中读取数据并将其存储在指定的变量中。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数


(2)ostream

ostream 是输出流的基类,它提供了向外部写入数据的功能。常用的 ostream 类有 ostream, ofstream写入到文件)和 ostringstream写入到字符串)。

⭕常用的 ostream 函数包括:

  • put():向流中写入一个字符。
  • write():向流中写入指定长度的数据。
  • operator<<:向流中写入数据。

例如:

int num = 42;
std::cout << "The answer is: " << num << std::endl; // 输出 "The answer is: 42"

(3)iostream

iostream 是同时具有输入和输出功能的流类,继承自 istreamostream。常用的 iostream 类有 iostreamfstream(用于文件输入输出)和 stringstream(用于字符串输入输出)。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

(4)cin 和 cout

cincout 是预定义的 istreamostream 对象,它们分别用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是屏幕)写入数据。

例如:

int num;
std::cout << "Enter a number: ";
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

除此之外,C++标准IO流还提供了一些其他重要的类和函数,如格式化输入输出、流状态检查和文件输入输出等。你可以通过查阅相关文档或教程深入了解更多关于C++标准IO流的知识。

2. C++文件IO流

C++文件IO流是C++标准库提供的用于文件输入和输出的一组类和函数。它们可以用于读取和写入文件中的数据。

⭕C++文件IO流主要涉及以下几个类:

(1)ifstream

ifstream:用于从文件中读取数据的输入流类。通过创建 ifstream 对象,可以打开一个文件并从中读取数据。

⭕常用的 ifstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator>>:从文件中读取数据。

示例代码:

#include <fstream>
#include <iostream>

int main() {
    std::ifstream file("example.txt");
    if (file.is_open()) 
    {
        int num;
        while (file >> num) 
        {
            std::cout << num << std::endl; // 输出文件中的整数
        }
        file.close();
    } 
    else 
    {
        std::cerr << "Failed to open file." << std::endl;
    }
    return 0;
}

(2)ofstream

ofstream:用于向文件中写入数据的输出流类。通过创建 ofstream 对象,可以打开一个文件并向其中写入数据。

⭕常用的 ofstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator<<:将数据写入文件。

示例代码:

#include <fstream>

int main() {
    std::ofstream file("example.txt");
    if (file.is_open()) {
        file << "Hello, World!" << std::endl; // 向文件中写入字符串
        file.close();
    } else {
        std::cerr << "Failed to open file." << std::endl;
    }
    return 0;
}

(3)fstream

fstream:同时具有读取和写入功能的文件流类。通过创建 fstream 对象,可以打开一个文件并在其中进行读写操作。

⭕常用的 fstream 成员函数除了可以使用 ifstreamofstream 的成员函数外,还包括:

  • seekg():设置输入位置指针(用于读取)。
  • seekp():设置输出位置指针(用于写入)。

示例代码:

#include <fstream>
#include <iostream>

int main() {
    std::fstream file("example.txt", std::ios::in | std::ios::out);
    if (file.is_open()) 
    {
        int num;
        while (file >> num) 
        {
            std::cout << num << std::endl; // 从文件中读取整数并输出
        }
        file.seekp(0, std::ios::end); // 将输出位置指针移动到文件末尾
        file << "New data" << std::endl; // 向文件中写入新数据
        file.close();
    } 
    else 
    {
        std::cerr << "Failed to open file." << std::endl;
    }
    return 0;
}

在使用文件IO流时,需要包含头文件 <fstream>,并根据需要选择适当的流对象(ifstreamofstreamfstream)。

四、stringstream的简单介绍

stringstream 是 C++ 标准库中的一个流类,它可以像 cout 和 cin 一样进行输入输出操作。不同之处在于 stringstream 不是对控制台进行输入输出,而是对字符串进行输入输出。

stringstream 继承自 istream 和 ostream,因此它既可以进行输入操作,也可以进行输出操作。stringstream 的主要作用是将数据转换为字符串或从字符串中读取数据。使用 stringstream 可以方便地进行格式化输出和解析字符串。

stringstream 的头文件是 <sstream>,它定义了以下三个类:

  • std::istringstream:从字符串中读取数据的输入流。
  • std::ostringstream:将数据输出到字符串的输出流。
  • std::stringstream:既可以输入数据,也可以输出数据的流。

使用 stringstream 进行输入输出操作的一般流程如下:

  1. 创建 stringstream 对象

可以使用默认构造函数创建一个空的 stringstream 对象,例如:

std::stringstream ss;
  1. 输入数据

可以使用运算符 << 将数据写入 stringstream 中,例如:

int num = 123;
std::string str = "hello";
ss << "The number is: " << num << ", the string is: " << str;
  1. 输出数据

可以使用成员函数 str()str(std::string&) 获取 stringstream 所包含的字符串,例如:

std::string output = ss.str();
std::cout << output << std::endl; // 输出:The number is: 123, the string is: hello
  1. 解析字符串

可以使用运算符 >>stringstream 中读取数据,例如:

std::string input = "123 4.56 hello";
int num;
double d;
std::string str;
ss.clear(); // 清空 stringstream 对象
ss.str(input);
ss >> num >> d >> str;
std::cout << num << " " << d << " " << str << std::endl; // 输出:123 4.56 hello

🚨🚨注意:在读取数据之前应该先清空 stringstream 对象,并使用成员函数 str(std::string&) 将要解析的字符串写入 stringstream

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!


目录
相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
91 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
86 1
Linux C/C++之IO多路复用(aio)
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
39 2
C++入门12——详解多态1
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
25 0
Linux C/C++之IO多路复用(poll,epoll)
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
81 1
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
27 0
|
1月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
1月前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
31 0