C++标准IO库 二进制读写

C++标准IO库

特性

  • 标准库类型不允许做 复制或赋值 操作
    • 形参和返回类型 不能是流类型 , 必须使用指针或引用
  • 对IO对象的读写会改变状态,因此引用必须是非const的

缓冲区

缓冲区刷新的可能情况
  1. 程序正常结束
  2. 缓存区满了
  3. 用操纵符(manipulator) 显示的刷新缓冲区,e.g. endl
  4. 使用unitbuf操纵符设置流的内部状态 (C++Primer 红书p250)
  5. 输出流和输入流 tie 起来

文件的输入和输出

支持文件的IO类型 功能简介 派生源
  • ifstream: 读文件; from istream
  • ofstream : 写文件; from ostream
  • fstream: 对同一个文件读写; from iostream
特殊操作
  • open: 打开文件流
  • close: 关闭文件流
  • clear: 清除文件流的状态
  • 形参为要打开文件名的 构造函数
文件模式(file mode)
  1. 文件模式也是整型常量
  2. 模式是文件的属性,不是流的属性
  • in: 读
  • out: 写,同时清空
  • app: 文件尾部添加
  • ate: 将文件定位在文件尾
  • trunc: 清空已存在的文件流
  • binary: 二进制模式IO操作
打开检查
//ifstream infile ("1");
    ifstream infile;
    infile.open("1");
// check up state of opening file
    if (! infile )
    {   // ok to open file 1
        cerr << "open fail: " << "1" << endl;
        return -1;
    } 
二进制读写
  • 几个函数
函数用途
gcount ( )返回最后一次输入所读入的字节数
tellg ( )返回输入指针的当前位置
seekg ( 文件中的位置 )将输入文件中指针移动到指定的位置
seekg ( 位移量, 参照位置 )以参照位置为标准移动指针
tellp ( )返回输出文件指针当前位置
seekp ( 文件中的位置 )将输出文件中指针移动到指定的位置
seekp ( 位移量, 参照位置 )以参照位置为标准移动指针

- 系统的参照位置
- ios::beg 所打开文件的开头,这是默认值
- ios::cur 文件读写指针当前的位置
- ios::end 文件结尾
- 实验代码

# include "stdafx.h"
# include <iostream>
# include <fstream>
#include <string>
using namespace std;

int main (int argc ,char **argv)
{
    //input param about in-file
    string in = argv[1];

    //equivalent to:
    //  ifstream infile ("1");
    ifstream infile;
    infile.open(in,ifstream::binary);

    ofstream outfile("out.txt",ofstream::binary);


    // check up state 
    if (! infile )
    {   //wrong to open file(in)
        cerr << "open fail" << "in" << endl;
        return -1;
    } 
    if (!outfile)
    {
        // wrong to open file(out) 
        cerr << "open fail " << "out " << endl;
    }
    //compute the size of file-in
    infile.seekg(0, ios::end);
    long fSize = infile.tellg();

    //move point to begin
    infile.seekg(0, ios::beg);

    //set buffer 
    const int bufferSize = 8;
    char p[bufferSize] = {0};

    int readLen = bufferSize;


    if (fSize < bufferSize)
    {
        readLen = fSize;
    }

    while (infile.read(p,readLen))
    {
        outfile.write(p, readLen);
        fSize -= bufferSize;

        //output
        for (int i =0 ; i != readLen ; ++i)
        {
            cout << p[i]<<endl;
        }
        //prefer for next loop
        if (fSize < bufferSize)
        {
            readLen = fSize;
        }
        if (fSize<0)
        {
            break;
        }
    }
    // close stream
    infile.close();
    outfile.close();
    cout << "ok" << endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以使用二进制文件来存储二进制数据,例如图片、音频、视频等等。下面是一个简单的例子,演示如何将二进制数据写入文件和从文件中读取二进制数据: ``` #include <iostream> #include <fstream> using namespace std; int main() { // 将二进制数据写入文件 char data[] = {0x12, 0x34, 0x56, 0x78}; ofstream outfile("data.bin", ios::binary); outfile.write(data, sizeof(data)); outfile.close(); // 从文件中读取二进制数据 char buffer[4]; ifstream infile("data.bin", ios::binary); infile.read(buffer, sizeof(buffer)); infile.close(); // 打印二进制数据 for (int i = 0; i < sizeof(buffer); i++) { cout << hex << (int)buffer[i] << " "; } cout << endl; return 0; } ``` 在上面的例子中,我们将一个长度为4的char数组(即4个字节)作为二进制数据,写入名为“data.bin”的文件中。我们使用了ofstream类来打开文件,并使用了ios::binary标志来指示文件是以二进制模式打开的。我们使用了write()方法将数据写入文件中,并使用了close()方法关闭文件。 接下来,我们从文件中读取二进制数据。我们创建了一个长度为4的char数组作为缓冲区,使用了ifstream类来打开文件,并使用了ios::binary标志来指示文件是以二进制模式打开的。我们使用了read()方法将数据读取到缓冲区中,并使用了close()方法关闭文件。 最后,我们打印了缓冲区中的数据,使用了hex标志来指示以十六进制格式打印数据。 需要注意的是,如果要存储的二进制数据较大,可能需要使用更高级的数据系统,例如MySQL或MongoDB。这些数据系统可以存储二进制数据,并提供了丰富的API和查询语言来操作数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值