• 【C++Primer---C++知识点记录*V---IO库】


    目录

    IO类

    IO对象无拷贝或赋值

    条件状态

    管理输出缓冲

    文件输入输出

    string流


    IO类

    iostream定义了用于读写流的基本类型

    fstream定义了读写命名文件的类型

    sstream定义了读写内存string对象的类型

    标准库使我们能忽略不同类型的流之间的差异,这是通过继承机制实现的(例如ifstream继承自istream)

    IO对象无拷贝或赋值

    因为不能拷贝,所以不能将形参和返回值类型设置为流类型,所以进行IO操作的函数要以引用的方式传递和返回流。

    条件状态

    有一些函数和标志,可以帮助我们访问和操纵流的条件状态

    p280

    管理输出缓冲

    每个输出流都管理一个缓冲区,用来保存程序读写的数据

    有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作。由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合为单一的设备写操作可以带来很大的性能提升。

    unitbuf操纵符--告诉流在接下来的每次操作中都进行一次flush操作(刷新缓冲区)

    注意:如果程序崩溃,输出缓冲区不会被刷新。因此有时程序其实已经执行完了,只不过结果因为缓冲区没有刷新没法显示!

    当一个输入流被关联到输出流时,从输入流读数据,就会先刷新关联的输出流。标准库将cout和cin关联在一起

    怎么关联?——tie

    版本1:不带参数,返回指向输出流的指针(空指针/该对象关联的输出流的指针)

    版本2:接受一个指向ostream的指针,关联到该ostream

     

    文件输入输出

    头文件fstream定义了三种类型——ifstream  ofstream  fstream

    文件类型分为文本文件和二进制文件

    写文件

     

    而文件打开方式有:

     文件打开方式是可以配合使用的,在中间用 | 操作符就ok

    读文件

     

    1. int main() {
    2. ifstream ifs;
    3. ifs.open("z.txt", ios::in);
    4. if (!ifs.is_open()) {
    5. cout << "打开失败!" << endl;
    6. return 0;
    7. }
    8. //读数据
    9. //1.
    10. char buf[1024] = { 0 };
    11. while (ifs >> buf) {
    12. cout << buf << endl;
    13. }
    14. //2.
    15. char buf[1024] = { 0 };
    16. while (ifs.getline(buf,sizeof(buf))){
    17. cout << buf<<endl;
    18. }
    19. //3.
    20. string buf;
    21. while (getline(ifs, buf)) {
    22. cout << buf << endl; //都是一行行读
    23. }
    24. //4.
    25. char c;
    26. while ((c=ifs.get())!=EOF) {
    27. cout << c;
    28. }
    29. ifs.close();
    30. }

    读写文件-二进制

    用到了ofs和ifs类中的write和read函数,同时要记得在open时加上打开方式ios::binary

    1. class Person {
    2. public:
    3. char name[64];
    4. int age;
    5. };
    6. int main() {
    7. ofstream ofs;
    8. ofs.open("Person.txt", ios::out | ios::binary);
    9. Person p = { "喵喵",8 };
    10. ofs.write((const char*)&p, sizeof(Person));
    11. ofs.close();
    12. ifstream ifs;
    13. Person buf;
    14. ifs.open("Person.txt", ios::in | ios::binary);
    15. ifs.read((char*)&buf, sizeof(Person));
    16. cout << buf.name << " " << buf.age;
    17. ifs.close();
    18. }

    string流

    当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream

    1. struct personInfo {
    2. string name;
    3. vector<string>phone;
    4. };
    5. int main() {
    6. string line, word; //line中存放每一条记录,word是姓名后边的一串电话
    7. vector<personInfo> people; //保存来自所有输入的记录
    8. while (getline(cin, line)) {
    9. personInfo info;
    10. istringstream record(line); //把record绑定到line
    11. record >> info.name; //读取名字
    12. while (record >> word) //读取名字后面的一个个单词
    13. info.phone.push_back(word);
    14. people.push_back(info);
    15. }
    16. }

    当我们逐步构造输出,希望最后一起打印时,用ostringstream

    (p289)

    先把输出内容“写入”到一个ostringstream对象中

    os<<xxxx

    之后输出:cout<<os.str() //返回一个字符串

        

  • 相关阅读:
    什么是数字孪生智慧城市应用场景
    Js逆向教程19-websocket介绍
    vm2 组件存在沙箱逃逸漏洞
    Jetson Xavier NX 与飞控(Pixhawk 4 Mini)实现串口通信
    【Java SE】封装的详解
    物体分类__pytorch
    C语言实现《猜数字游戏》
    Azure Data Factory(九)基础知识回顾
    Hive 知识点八股文记录 ——(二)优化
    协议栈——连接服务器
  • 原文地址:https://blog.csdn.net/weixin_53459056/article/details/125477438