C++的IO流

一、C语言的输入与输出

        C语言中的输入与输出操作通过标准库函数实现,printfscanf是最常用的输入输出函数。输入与输出操作依赖于缓冲区来临时存储数据,缓冲区的刷新和清除是确保数据正确传递的重要步骤。此外,C语言还提供了文件输入与输出的功能,通过文件操作函数可以实现数据的持久化存储。

C语言输入、输出缓冲区的优势:

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

二、什么是流

1. 流的概念

水从水龙头流出,通过水管流向水槽。在这个过程中,水龙头是水的源头,水槽是水的目的地,水管则是水流动的通道。类似地,在计算机科学中,流可以看作是数据从一个源头(如键盘、文件、网络)流向一个目的地(如屏幕、文件、网络)的通道。

流的特点:

  • 连续性:数据像水流一样连续不断地传输。
  • 方向性:数据有明确的流动方向,从源头流向目的地。
  • 缓冲:流通常会使用缓冲区来临时存储数据,以提高传输效率。

在计算机中,流是一种抽象的数据通道,用于处理输入和输出操作。流可以处理各种类型的数据,包括字符、字节、文件等。流的主要优点是它们提供了一种统一的方式来处理不同类型的数据源和目的地。

  • 输入流:从外部设备(如键盘、文件)读取数据到程序中。
  • 输出流:将程序中的数据写入到外部设备(如屏幕、文件)。

2.C++中的流

        C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。
        它的特性是:有序连续、具有方向性为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。
 

三、C++的IO流

1.标准IO流

标准I/O流对象

C++标准库提供了四个主要的预定义流对象:

  • cin:标准输入流,用于从键盘读取数据。
  • cout:标准输出流,用于向屏幕输出数据。
  • cerr:标准错误流,用于向屏幕输出错误信息。
  • clog:标准日志流,用于向屏幕输出日志信息。

cin - 标准输入流

cin用于从标准输入设备(通常是键盘)读取数据。它通常与提取操作符>>一起使用。

#include <iostream>

int main() {
    int number;
    std::cout << "Enter a number: ";
    std::cin >> number; // 从键盘读取数据
    std::cout << "You entered: " << number << std::endl;
    return 0;
}

cout - 标准输出流

cout用于向标准输出设备(通常是屏幕)输出数据。它通常与插入操作符<<一起使用。

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl; // 向屏幕输出数据
    return 0;
}

cerr - 标准错误流

cerr用于向标准输出设备(通常是屏幕)输出错误信息。与cout不同,cerr通常是无缓冲的,这意味着错误信息会立即显示。

#include <iostream>

int main() {
    std::cerr << "An error occurred!" << std::endl; // 向屏幕输出错误信息
    return 0;
}

clog - 标准日志流

clog用于向标准输出设备(通常是屏幕)输出日志信息。与cerr不同,clog通常是有缓冲的,这意味着日志信息会在缓冲区满或程序结束时才显示。

#include <iostream>

int main() {
    std::clog << "Logging some information." << std::endl; // 向屏幕输出日志信息
    return 0;
}

注意:

1. cin为缓冲流。 键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用, 如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了只有把输入缓冲区中的数据取完后,才要求输入新的数据
2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。
3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输
入。但如果是 字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。
4. cin和cout可以直接输入和输出内置类型数据,原因: 标准库已经将所有内置类型的输入和输出全部重载了。
5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。
 

2.文件IO流

文件I/O流是C++中用于处理文件输入和输出操作的一组类。它们允许程序从文件中读取数据(输入)或将数据写入文件(输出)。C++标准库通过<fstream>头文件提供了文件I/O流的支持,主要包括三个类:

  • ifstream:用于从文件中读取数据(输入文件流)。
  • ofstream:用于向文件中写入数据(输出文件流)。
  • fstream:用于同时进行文件的读取和写入操作(输入输出文件流)。
C++根据文件内容的数据格式分为 二进制文件文本文件。采用文件流对象操作文件的一般步骤:
1. 定义一个文件流对象。
2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
4. 关闭文件
 

四、stringstream

在C语言中如果想要将一个整形变量的数据转化为字符串格式,如何去做?

1. 使用itoa()函数
2. 使用sprintf()函数
但是两个函数在转化时,都得 需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且 转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃
 

于是C++更新了stringstream,stringstream 是 C++ 标准库中的一个类,用于处理字符串的输入和输出操作。它属于 <sstream> 头文件,提供了类似于 cin 和 cout 的功能,但操作的对象是字符串而不是标准输入输出设备。

stringstream 主要用于以下场景:

  • 字符串拼接:将多个字符串或其他数据类型拼接成一个字符串。
  • 字符串解析:从字符串中提取数据,类似于从文件或标准输入读取数据。

 示例:

#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;

    // 字符串拼接
    int number = 42;
    std::string text = "The answer is";
    ss << text << " " << number;

    // 获取字符串内容
    std::string result = ss.str();
    std::cout << "Concatenated string: " << result << std::endl; // 输出: The answer is 42

    // 清空 stringstream
    ss.clear();
    ss.str("");

    // 字符串解析
    std::string input = "Hello 123";
    ss << input;
    std::string extractedText;
    int extractedNumber;
    ss >> extractedText >> extractedNumber;

    std::cout << "Extracted text: " << extractedText << std::endl; // 输出: Hello
    std::cout << "Extracted number: " << extractedNumber << std::endl; // 输出: 123

    return 0;
}

注意:

1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果
2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空。
3. 可以 使用s. str("")方法将底层string对象设置为""空字符串
4. 可以 使用s.str()将让stringstream返回其底层的string对象
5. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参 数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值