• C++ STL——输入输出流



    注:原创不易,转载请务必注明原作者和出处,感谢支持!

    注:内容来自某培训课程,不一定完全正确!

    一 缓冲区

    (1)标准输入:从键盘输入数据到程序(input)

    (2)标准输出:程序数据输出到显示器(output)

    (3)标准输入 + 标准输出 = 标准I/O

    (4)文件I/O = 文件的输入和输出

    缓冲区是位于内存当中的一小块内存用于缓冲输入(输入缓冲区)内容或者输出(输出缓冲区)内容。

    二 标准输入流cin

    标准输入流cin的成员方法有:

    方法 描述
    cin.get() 返回缓冲区的第一个字符
    cin.get(ch) 返回缓冲区的第一个字符并存入char类型变量ch中
    cin.get(buf, 256) 从缓冲区中读取一个字符串存入buf中
    cin.getline(buf, 256) 从缓冲区中读取一行数据(不包括换行符)
    cin.ignore() 忽略当前的字符
    cin.peek() 偷瞄一眼(返回)缓冲区的第一个字符,不将该字符从缓冲区取走
    cin.putback() 将字符重新放入缓冲区首部

    下面是一个有关cin的应用案例。

    // cin
    void Test1()
    {
    	// 从缓冲区中一次读取一个字符,然后输出
    	char ch1;
    	while ((ch1 = cin.get()) != EOF)
    	{
    		cout << ch1 << endl;
    	}
    
    	char ch2;
    	cin.get(ch2);			// 读取一个字符
    
    	char buf[1024];
    	cin.get(buf, 1024);		// 从缓冲区读取一个字符串,存入buf中
    
    	cin.getline(buf, 1024);	// 读取一行数据(不包括换行符)
    
    	cin.ignore();			// 忽略一个字符
    	cin.ignore(2);			// 忽略两个字符
    	cin.ignore(10, '
    ');	// 忽略前10个字符,直到遇到'
    '
    
    	cin.peek();				// 偷瞄一眼(返回)缓冲区的第一个字符,不将该字符从缓冲区开头取走!
    	
    	// 从缓冲区取走一个字符然后将其重新放入缓冲区首部
    	char ch = cin.get();
    	cin.putback(ch);
    }
    

    三 标准输出流cout

    标准输出流cout的成员方法有:

    方法 描述
    cout.flush() 刷新缓冲区
    cout.put() 向缓冲区写字符
    cout.write() 二进制流的输出
    cout.width() 输出格式控制符
    cout.fill() 设定填充符号
    cout.setf(flag) 设置标志

    下面是一个cout的应用实例。

    // cout
    void Test2()
    {
    	cout << "Hello World!";		// 不会立马输出,而是将"Hello World!"送入输出缓冲区
    	cout.flush();				// 刷新缓冲区,"Hello World!"才会显示在屏幕上
    
    	// 往缓冲区插入字符
    	cout.put('I').put(' ').put('L').put('O').put('V').put('E');
    	cout << endl;
    
    	// 二进制流输出
    	cout.write("I LOVE CHINA", strlen("I LOVE CHINA"));
    	cout << endl;
    
    	// 格式化输出
    	int number = 10;
    	cout << "十进制:" << number << endl;
    	cout.unsetf(ios::dec);		// 卸载默认的十进制输出方式
    	cout.setf(ios::oct);		// 设置为八进制输出方式
    	cout.setf(ios::showbase);	// 显示八进制前导0
    	cout << "八进制:" << number << endl;
    	cout.unsetf(ios::oct);		// 卸载八进制输出方式
    	cout.setf(ios::hex);		// 设置为十六进制输出方式
    	cout << "十六进制:" << number << endl;
    
    	// 设定显示位宽
    	cout.width(10);				// 10位的显示位宽
    	cout.fill('*');				// 其余部分用*填充
    	cout.setf(ios::left);		// 左对齐
    	cout << number << endl;
    
    	// 以上是通过成员方法实现输出控制的
    	// 下面通过输出控制符来进行输出控制
    	// 需要引入头文件iomapip
    	cout << hex							// 十六进制输出
    		<< setiosflags(ios::showbase)	// 显示十六进制前导0x
    		<< setw(10)						// 设定位宽为10
    		<< setfill('~')					// 其余部分用~填充
    		<< setiosflags(ios::left)		// 左对齐
    		<< number
    		<< endl;
    
    }
    

    四 文件输入输出

    文件输入流ifstream
    文件输出流ofstream
    文件输入输出流fstream
    文件的打开方式
    文件流的状态
    文件流的定位:文件指针(输入指针,输出指针)
    文本文件和二进制文件

    文件流和文件流对象
    输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件为对象,即从磁盘文件读取数据,将数据输出到磁盘文件。和文件有关的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要定义了三个类,由这三个类控制对文件的各种输入输出操作,它们分别是ifstreamofstreamfstream。其中fstream类是由iostream类派生而来,它们之间的继承关系如下。

    graph TD; istream-->ifstream; istream-->iostream; ostream-->ofstream; ostream-->iostream; iostream-->fstream;

    由于文件设备并不像显示器屏幕和键盘一样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个类的对象。

    ifstream类,它是从istream类派生的,用来支持从磁盘文件的输入。
    ofstream类,它是从ostream类派生的,用来支持向磁盘文件的输出。
    fstream类,它是从iostream类派生的,用来支持对磁盘文件的输入输出。

    下面是一个文本文件读写的应用案例。

    // 文本文件读写
    void TestText()
    {
    	char *source = "C:\src.txt";
    	char *destination = "C:\dst.txt";
    
    	// 以只读方式打开文件 
    	ifstream is(source, ios::in);
    	if (!is)
    	{
    		cerr << "打开文件失败!" << endl;
    		return;
    	}
    
    	// 等价写法
    	// ifstream ism;
    	// ism.open(source, ios::in);
    
    	// 开始读文件
    	// char ch;
    	// while (is.get(ch))
    	// {
    	//  	cout << ch;
    	// }
    	// cout << endl;
    
    	// 文件关闭
    	// is.close();
    
    	// 以追加写入的方式打开文件,ios::app表示append追加
    	ofstream os(destination, ios::out | ios::app);
    	if (!os)
    	{
    		cerr << "打开文件失败!" << endl;
    		return;
    	}
    
    	// 从source读取往destination写入
    	char ch;
    	while (is.get(ch))
    	{
    		cout << ch;
    		os.put(ch);
    	}
    	cout << endl;
    
    	// 关闭文件
    	is.close();
    	os.close();
    }
    

    下面是一个使用二进制文件读写进行对象序列化的案例。

    // Person类
    class Person
    {
    public:
    	Person() = default;
    	Person(int age, int id) : age(age), id(id) {}
    	void Show()
    	{
    		cout << "age = " << age << endl;
    		cout << "id = " << id << endl;
    	}
    
    private:
    	int age;
    	int id;
    };
    
    // 二进制文件读写
    void TestBinary()
    {
    	// Windows下的每行结束标志是
    ,而Linux下每行结束标志就是
    
    	// 所以在Linux下,用文本模式或者二进制模式去读文本文件没有任何区别
    	// 但Windows下却存在着不小的差别,具体如下:
    	// 如果你用文本模式读取文本文件,则Windows会将
    转换成
    
    	// 如果你用文本模式写入文本文件,则Windows会将
    转换成
    
    	// 如果你用二进制模式读写文件,则不存在转换,如论读写都保留
    
    
    	// 将p1,p2写入文件里
    	Person p1(10, 1001);
    	Person p2(11, 1002);
    
    	char *destination = "C:\dst.txt";
    	// 以二进制方式ios::binary打开文件
    	ofstream os(destination, ios::out | ios::binary);
    	if (!os)
    	{
    		cerr << "打开文件失败!" << endl;
    		return;
    	}
    	// 以二进制方式写文件
    	os.write((char *)&p1, sizeof(p1));
    	os.write((char *)&p2, sizeof(p2));
    	// 关闭文件
    	os.close();
    
    	// 读取二进制文件
    	ifstream is(destination, ios::in | ios::binary);
    	if (!is)
    	{
    		cerr << "打开文件失败!" << endl;
    		return;
    	}
    	Person p;
    	is.read((char *)&p, sizeof(Person));
    	p.Show();
    	is.read((char *)&p, sizeof(Person));
    	p.Show();
    
    	// 关闭文件
    	is.close();
    }
    
  • 相关阅读:
    介绍一些好用的ArcToolbox工具(默认ArcGIS没有)
    我的技术博客开始啦
    Qualcomm和MTK两个android平台比较
    kali安装nessus
    ImportError: cannot import name pxssh
    python 批量下载文件
    GitHub如何修改用户名
    Sass中使用@each循环
    PhpStorm 实用快捷键
    GitHub如何删除一个repository(仓库)
  • 原文地址:https://www.cnblogs.com/laizhenghong2012/p/11782384.html
Copyright © 2020-2023  润新知