C++中的文件输入/输出(5):二进制文件的处理

C++中的文件输入/输出(5)

原作:Ilia Yordanov,  loobian@cpp-home.com

 

二进制文件的处理

 

虽然有规则格式(formatted)的文本(到目前为止我所讨论的所有文件形式)非常有用,但有时候你需要用到无格式(unformatted)的文件——二进制文件。它们和你的可执行程序看起来一样,而与使用<<>>操作符创建的文件则大不相同。get()函数与put()函数则赋予你读/写无规则格式文件的能力:要读取一个字节,你可以使用get()函数;要写入一个字节,则使用put()函数。你应当回想起get()——我曾经使用过它。你可能会疑惑为什么当时我们使用它时,输出到屏幕的文件内容看起来是文本格式的?嗯,我猜这是因为我此前使用了<<>>操作符。

 

译注:作者的所谓“规则格式文本(formatted text)”即我们平时所说的文本格式,而与之相对的“无格式文件(unformatted files)”即以存储各类数据或可执行代码的非文本格式文件。通常后者需要读入内存,在二进制层次进行解析,而前者则可以直接由预定好的<<>>操作符进行读入/写出(当然,对后者也可以通过恰当地重载<<>>操作符实现同样的功能,但这已经不是本系列的讨论范围了)。

 

get()函数与都各带一个参数:一个char型变量(译注:指get()函数)或一个字符(译注:指put()函数,当然此字符也可以以char型变量提供)

假如你要读/写一整块的数据,那么你可以使用read()write()函数。它们的原型如下:

 

istream &read(char *buf, streamsize num);

ostream &write(const char *buf, streamsize num);

 

对于read()函数,buf应当是一个字符数组,由文件读出的数据将被保存在这儿。对于write()函数,buf是一个字符数组,它用以存放你要写入文件的数据。对于这两个函数,num是一个数字,它指定你要从文件中读取/写入的字节数。

假如在读取数据时,在你读取“num”个字节之前就已经到达了文件的末尾,那么你可以通过调用gcount()函数来了解实际所读出的字节数。此函数会返回最后一次进行的对无格式文件的读入操作所实际读取的字节数。

在给出示例代码之前,我要补充的是,如果你要以二进制方式对文件进行读/写,那么你应当将ios::binary作为打开模式加入到文件打开的参数表中。

现在就让我向你展示示例代码,你会看到它是如何运作的。

 

示例1:使用get( )put( )

 

#include <fstream.h>

 

void main()

{

    fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

    char ch;

    ch='o';

 

    File.put(ch); // ch的内容写入文件

 

    File.seekg(ios::beg); // 定位至文件首部

 

    File.get(ch); // 读出一个字符

 

    cout << ch << endl; // 将其显示在屏幕上

 

    File.close();

}

 

示例2:使用read( )write( )

 

#include <fstream.h>

#include <string.h>

 

void main()

{

    fstream File("test_file.txt",ios::out | ios::in | ios::binary);

 

    char arr[13];

    strcpy(arr,"Hello World!"); //Hello World!存入数组

 

    File.write(arr,5); // 将前5个字符——"Hello"写入文件

 

    File.seekg(ios::beg); // 定位至文件首部

 

    static char read_array[10]; // 在此我将打算读出些数据

 

    File.read(read_array,3); // 读出前三个字符——"Hel"

 

    cout << read_array << endl; // 将它们输出  

 

    File.close();

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在C++读取ONNX二进制文件可以使用ONNX Runtime库。 首先,你需要在你的项目添加ONNX Runtime库的头文件和库文件。然后,你需要使用`Ort::Env`类创建一个环境对象: ```c++ Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); ``` 接下来,你需要使用`Ort::SessionOptions`类创建一个会话选项对象: ```c++ Ort::SessionOptions session_options; ``` 然后,你需要设置会话选项对象以指定使用CPU或GPU计算: ```c++ session_options.SetIntraOpNumThreads(1); session_options.SetSessionGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_BASIC); session_options.SetExecutionMode(ExecutionMode::ORT_SEQUENTIAL); session_options.SetLogSeverityLevel(1); ``` 现在,你可以使用`Ort::Session`类创建一个会话对象并加载ONNX模型: ```c++ Ort::Session session(env, model_path.c_str(), session_options); ``` 其,`model_path`是ONNX模型的路径。现在,你可以使用`Ort::AllocatorWithDefaultOptions`类创建一个分配器对象并分配输入输出张量: ```c++ Ort::AllocatorWithDefaultOptions allocator; std::vector<float> input_tensor_values; // fill input_tensor_values with input values std::vector<int64_t> input_tensor_shape; // set input_tensor_shape to the shape of the input tensor Ort::Value input_tensor = Ort::Value::CreateTensor<float>(allocator, input_tensor_values.data(), input_tensor_values.size(), input_tensor_shape.data(), input_tensor_shape.size()); std::vector<const char*> input_names = session.GetInputNames(); std::vector<const char*> output_names = session.GetOutputNames(); std::vector<Ort::Value> output_tensors = session.Run(Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), output_names.size()); ``` 其,`input_tensor_values`是输入张量的值,`input_tensor_shape`是输入张量的形状,`input_names`是输入张量的名称,`output_names`是输出张量的名称。`output_tensors`是一个包含输出张量的向量。你可以从输出张量获取结果: ```c++ float* output_tensor_values = output_tensors[0].GetTensorMutableData<float>(); std::vector<int64_t> output_tensor_shape(output_tensors[0].GetTensorTypeAndShapeInfo().GetShape()); ``` 其,`output_tensor_values`是输出张量的值,`output_tensor_shape`是输出张量的形状。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值