C++ | 深入理解C++的IO流:从控制台输出流到文件输出流的应用

目录

13--C++的IO流

1、流的概念

2、C语言的输入输出基础——fprintf、fscanf

fprintf

fscanf

3、C++的IO流——cin/clog/cerr

4、标准IO流的使用

5、文件IO流


13--C++的IO流

在C++编程中,IO(输入/输出)流是处理数据流的基本方式,它允许我们以一种非常直观和高效的方式与外部世界进行交互。本文将带你深入了解C++的IO流,从基础的输入输出操作到高级的文件操作和stringstream的应用。

1、流的概念

“流”是一个形象的比喻,描述了数据从一个地方流向另一个地方的过程。在C++中,流的概念被用来描述数据从外部输入设备(如键盘)流向内存,或者从内存流向外部输出设备(如显示器)的过程。C++的流具有有序连续和方向性的特点。

2、C语言的输入输出基础——fprintf、fscanf

在C语言中,我们通常使用scanf()printf()函数来进行输入输出操作。scanf()从标准输入设备(通常是键盘)读取数据并存储到变量中,而printf()则将数据输出到标准输出设备(通常是屏幕)。这些操作都依赖于缓冲区,它不仅简化了低级I/O的实现,还允许我们以“行”为单位进行数据处理。

笔记:在C语言中,最常用的接口是fprintf和scanf,只需要在printf和scanf的基础上,第一个参数设置为文件指针即可使用,方便快捷!

fprintf

fprintf 函数用于向指定的文件流中写入格式化的数据。它的原型如下:

int fprintf(FILE *stream, const char *format, ...);

  • stream 是指向 FILE 结构的指针,表示要写入数据的文件流。
  • format 是一个格式字符串,定义了数据的格式和类型。
  • 后面的省略号(...)表示函数可以接受多个参数,这些参数将按照 format 字符串中的格式进行格式化。

fprintf 通常用于将数据输出到文件,但它也可以用于标准输出(stdout),这时 stream 可以是 stdout 宏。

fscanf

fscanf 函数用于从指定的文件流中读取格式化的数据。它的原型如下:

int fscanf(FILE *stream, const char *format, ...);

  • stream 是指向 FILE 结构的指针,表示要从中读取数据的文件流。
  • format 是一个格式字符串,定义了期望读取的数据格式和类型。
  • 后面的省略号(...)表示函数可以接受多个参数的地址,这些参数将按照 format 字符串中的格式填充读取到的数据。

fscanf 通常用于从文件中读取数据,但它也可以用于标准输入(stdin),这时 stream 可以是 stdin 宏。

3、C++的IO流——cin/clog/cerr

C++提供了一个丰富的IO类库,其中ios是基类,其他类都是从ios派生而来。C++标准库中定义了四个全局流对象:cincoutcerrclogcin用于标准输入,cout用于标准输出,cerr用于错误输出,而clog用于日志输出。这些流的使用需要包含相应的头文件并使用std命名空间。

注意:如果没有自己修改底层,cin、clog、cerr是一样的

4、标准IO流的使用

使用cincout时,需要注意以下几点:

  • cin是一个缓冲流,输入的数据保存在缓冲区中,直到需要时才取出。
  • 输入的数据类型必须与提取的数据类型一致,否则会导致错误。
  • 空格和回车可以作为数据分格符,但字符型和字符串输入时需要注意。
  • 对于自定义类型,要支持cincout的输入输出,需要重载<<>>运算符。这样,自定义类型就可以像内置类型一样直接使用IO流。

5、文件IO流

C++中的文件IO流允许我们以文本或二进制形式读写文件。操作文件的一般步骤包括定义文件流对象、打开文件、进行读写操作以及关闭文件。

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
class Terminal2File
{
private:
    string _fileName;
public:
    Terminal2File(const string& fileName)
        :_fileName(fileName)
    {}

    void binWrite(void* file, size_t fileSize)
    {
        ofstream ofs("bin_" + _fileName, ios_base::out | ios_base::binary);
        ofs.write(static_cast<const char*>(file), fileSize);
    }

    void txtWrite(void* file, size_t fileSize)
    {
        ofstream ofs("txt_"+_fileName); // 默认就是文本输出
        ofs.write(static_cast<const char*>(file), fileSize);
    }

    void binRead(const string& fileName,void* file, size_t fileSize)
    {
        ifstream ifs(fileName, ios_base::in | ios_base::binary);
        ifs.read((char*)file, fileSize);
    }

    void txtRead(const string& fileName, void* file, size_t fileSize)
    {
        ifstream ifs(fileName);
        ifs.read((char*)file, fileSize);
    }
};

int main()
{
    const char* name = "2024/8/09";
    Terminal2File run{ "file1" };
    run.binWrite(static_cast<void*>(const_cast<char*>(name)), strlen(name));
    run.txtWrite(static_cast<void*>(const_cast<char*>(name)), strlen(name));
    // 这里涉及到c++的四种类型转换 不明白的可以参考这篇博客~~(链接在代码块下方)
    char* p = new char [1000];
    memset(p, 0, 1000);
    run.binRead("bin_file1", p, strlen(name));
    cout << p << endl;
    run.txtRead("hahaha", p, 110);
    cout << p << endl;

    return 0;
}

关于C++中static_cast、const_cast等类型转换:C++ | 深入剖析C++中的类型转换-CSDN博客

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值