• C++-IO相关



    一、cin,cout

    iostream 标准库,它提供了 cincout 方法分别用于 从标准输入读取流向标准输出写入流

    二、文件的读写

    在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件

    数据类型作用
    ofstream输出文件流,用于创建文件并向文件写入数据
    ifstream输入文件流,用于从文件读取数据到流中
    fstream表示通用文件流,具有ofstream和ifstream的两种功能,所以它能够创建文件,向文件写入数据,从文件读取数据

    1.打开文件

    • 在从文件读取信息或者向文件写入信息之前,必须先打开文件。
      • ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果需要打开文件进行读操作,则使用 ifstream 对象。
      • 使用 open(const char *filepath,ios::openmode mode) 成员函数打开文件,并返回流对象
        第二个参数是指定打开方式,有一些标志:
        标志作用
        ios::app在文件末尾追加写入
        ios::ate文件打开后定位到文件末尾
        ios::in打开文件用于读取文件内容
        ios::out打开文件用于写入文件内容
        ios::trunc截断文件,当目标文件存在时,将文件长度设为0

    2.写入文件

    • 使用ofstream流插入运算符<< 写入数据

          char data[20];
          ofstream outstream;//输出文件流 创建文件并写入文件
          //打开文件(追加写的方式/不存在的时候创建)
          outstream.open("E:\\myCcode\\testFileOperation\\test.txt",ios::app);
          outstream << "测试一下写文件..." << endl;
          outstream.close();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 执行结果
      文件追加写

    3.读取文件

    • 使用ifstream流提取运算符>> 读取刚刚创建文件test.txt并写入的数据(第一行)

          ifstream instream;//输入文件流 读取文件
          //打开文件(读)
          instream.open("E:\\myCcode\\testFileOperation\\test.txt");
          instream >> data;
          cout << "读取文件获得的内容:" <<data << endl;
          instream.close();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 执行结果
      读文件

    4.关闭文件

    使用ofstream、ifstream、fstream的成员函数close()关闭打开的文件。

    5.定位文件内容

    • istream的seekg和ostream的seekp
      istream 的 seekg(“seek get”)和关于 ostream 的 seekp(“seek put”)
      使用seekg(),文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。

          //定位文件中内容位置  内容为:测试一下汉字编码是否正常
          instream.open("E:\\myCcode\\testFileOperation\\testLocated.txt");
          instream.seekg(6);//注意,一个汉字占两个字节
          instream >> seekdata;//这里作为流缓冲区不需要初始化
          cout << "读取文件定位后获得的内容:" << seekdata << endl;
          instream.close();
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 执行结果
      定位内容

    三、遇到的问题

    1.定位文件内容输出乱码

    • 代码
          //文本内容:测试一下汉字编码是否正常
          instream.seekg(6);//这里注意汉字占2个字节,读取时可能会变成乱码
          instream >> seekdata;
          cout << "读取文件定位后获得的内容:" << seekdata << endl;
          instream.close();
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 问题原因
      • 文件编码
        直接新建编辑的文本文件格式是UTF-8
        文本文件格式

        输出内容为乱码
        编码格式


        当把编码格式修改为ANSI时
        修改编码格式

        可以正常输出,不会有乱码了
        编码格式正常输出

      • 定位汉字字节位置问题
        在ANSI中一个汉字占两个字节,英文占一个字节,所以在定位的时候,如果定位到了汉字的第二个字节位置并对后续内容进行输出,会导致汉字乱码
        例:
        文本内容为:测试一下汉字编码是否正常
        1.如果使用seekg()定位第7个字节,会定位到“下”的第二个字节,就会出现乱码
        定位乱码

        2.定位第6个字节,会输出“下汉字编码是否正常”
        定位正常

    四、参考

    1.菜鸟教程-C++ 基本的输入输出
    2.菜鸟教程-C++ 文件和流

  • 相关阅读:
    Flutter笔记:拖拽手势
    【21天学习挑战赛】希尔排序
    C++使用二维码识别库Zbar识别二维码图像
    GBase 8s是如何保证数据一致性
    LeetCode-1403-非递增的最小子序列
    如何把JavaWeb项目部署到服务器
    supervisord 进程管理器 Laravel执行队列
    小型气象站的分类和选型要点
    mysql value 和values的区别
    你是否还迷茫要不要学习Linux?
  • 原文地址:https://blog.csdn.net/hehe_soft_engineer/article/details/126865526