• [C++ Primer] 第8章: IO库


    IO类

    iostream定义了读写流的基本类型
    istream, wistream 从流读取数据
    ostream, wostream 向流写入数据
    iostream, wiostream 读写流
    fstream定义了读写命名文件的类型
    ifstream, wifstream 从文件读取数据
    ofstream, wofstream 向文件写入数据
    fstream, wfstream 读写文件
    sstream定义了读写内存string对象的类型
    istringstream, wistringstream 从string读取数据
    ostringstream, wostringstream 向string写入数据
    stringstream, wstringstream 读写string

    fstream和sstream继承自iostream, 这意味着接受一个iostream类型引用(或指针)参数的函数, 可以用一个对应的fstream或sstream类型来调用.

    IO对象无拷贝或赋值. 进行IO操作的函数通常以引用方式传递和返回流. 读写一个IO对象会改变其状态, 因此传递和返回的引用不能是const的.

    刷新输出缓冲区: endl, flush, ends.

    • endl: 输出缓冲区和一个换行, 然后刷新缓冲区.
    • flush: 输出缓冲区,然后刷新缓冲区.
    • ends: 输出缓冲区和一个空字符, 然后刷新缓冲区.

    如果程序异常终止, 输出缓冲区是不会被刷新的.

    文件输入输出

    fstream特有的操作:
    fstream fstrm; 创建一个未绑定的文件流.
    fstream fstrm(s); 创建一个fstream, 并打开名为s的文件. s可以是string类型, 或者是一个指向C风格字符串的指针. 这些构造函数是explicit的.
    fstream fstrm(s, mode); 以指定的方式打开.
    fstrm.open(s); 打开名为s的文件.
    fstrm.close(); 关闭与fstrm绑定的流.
    fstrm.is_open() 返回一个bool值指出与fstrm绑定的流是否成功打开且尚未关闭.
    mode模式有:
    in 以读方式打开
    out 以写方式打开, 会丢弃已有数据
    app 向文件末尾添加
    ate 打开文件后立即定位到末尾
    trunc 截断文件
    binary 以二进制方式打开
    // 拷贝文本文件infile.txt内容到outfile.txt
    int main()
    {
    	ifstream input("infile.txt"); // 构造一个ifstream并打开给定的文件
    	ofstream output;              // 输出文件流未关联到任何文件
    	output.open("outfile.txt");   // 打开指定的文件, 文件名可以值C-style字符串, 也可以是string对象(C++11标准)
    
    	string line;
    	while(getline(input, line))
    	{
    		output << line << endl;
    	}
    
    	input.close(); // 当一个fstream对象被销毁时, close会自动调用, 也可以手动关闭
    	output.close();
    
    	return 0;
    }
    

    已out模式打开文件会丢失已有数据

    保留被ofstream打开的文件中已有数据的唯一方法是显示指定app或者in模式

    // file1内容会丢失
    ofstream out1("file1"); // 隐含out并trunc模式(截断文件)
    ofstream out2("file1", ofstream::out); // 隐含trunc
    ofstream out3("file1", ofstream::out | ofstream::trunc);
    // file2内容不会丢失
    ofstream out4("file2", ofstream::app); // 隐含out模式
    ofstream out5("file2", ofstream::out | ofstream::app);
    

    与ifstream关联的文件默认已in模式打开, 与ofstream关联的文件默认以out模式打开, 与fstream关联的文件默认已in和out模式打开.

    string流

    stringstream 特有操作
    sstream strm 创建一个未绑定的sstream对象
    sstream strm(s) strm是一个stream对象, 保存string s的一个拷贝. 此构造函数是explicit的.
    strm.str() 返回strm所保存的string的拷贝
    strm.str(s) 将string s拷贝到strm中.

    处理行内单词的个数时, 通常可以使用istringstream.

    int main()
    {
    	string in_str("Hello World!"), str;
    	vector<string> svec;
    	istringstream iss;   // 未绑定的对象
    	iss.str(in_str);
    	// istringstream iss(in_str); // 与上面两行等价
    
    	while(iss >> str)
    		svec.push_back(str); // 将每个单词存放到svec中
    
    	return 0;
    }
    

    当我们想逐步构造, 希望最后一起打印时, ostringstream是很有用的.

    int main()
    {
    	ostringstream oss;
    	// ... 省略若干行
    	oss << "aaa ";
    	// ... 省略若干行
    	oss << "bbbb ";
    
    	cout << oss.str() << endl;
    	return 0;
    }
    
  • 相关阅读:
    虎牙数万主播同时在线直播的秘密,CDN推流日志上行实时监控
    CDN边缘节点容器调度实践(下)
    CDN边缘节点容器调度实践(上)
    MySQL5.6复制技术(1)-原理详解
    AWS EC2 MySQL迁移到RDS案例
    OCP知识点讲解 之 检查点队列与增量检查点
    利用sqlldr从MySQL导出一张表数据到Oracle
    Oracle 11.2.0.4.0 Dataguard部署和日常维护(7)
    Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Dataguard Snapshot篇
    Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇
  • 原文地址:https://www.cnblogs.com/moon1992/p/7266201.html
Copyright © 2020-2023  润新知