C++-IO相关


一、cin,cout

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

二、文件的读写

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

数据类型作用
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();
    
  • 执行结果
    文件追加写

3.读取文件

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

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

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.定位文件内容输出乱码

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

      输出内容为乱码
      编码格式


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

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

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

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

四、参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值