C++ | 深入理解C++的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++标准库中定义了四个全局流对象:cin
、cout
、cerr
和clog
。cin
用于标准输入,cout
用于标准输出,cerr
用于错误输出,而clog
用于日志输出。这些流的使用需要包含相应的头文件并使用std
命名空间。
注意:如果没有自己修改底层,cin、clog、cerr是一样的
4、标准IO流的使用
使用cin
和cout
时,需要注意以下几点:
cin
是一个缓冲流,输入的数据保存在缓冲区中,直到需要时才取出。- 输入的数据类型必须与提取的数据类型一致,否则会导致错误。
- 空格和回车可以作为数据分格符,但字符型和字符串输入时需要注意。
- 对于自定义类型,要支持
cin
和cout
的输入输出,需要重载<<
和>>
运算符。这样,自定义类型就可以像内置类型一样直接使用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博客