当前位置: 首页 > news >正文

C++读取.bin二进制文件

C++读取.bin二进制文件

在C++中,可以使用文件输入/输出流来进行二进制文件的读写操作,方便数据的保存和读写。

//C++读取bin二进制文件
int read_bin()
{std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);if (file) {// 按照二进制格式读取数据file.seekg(0, std::ios::end);long long fileSize = file.tellg();printf("size of firm: %lld\n", fileSize);// 将读写位置移动到文件开头,申请内存,将固件内容存入bufferfile.seekg(0, std::ios::beg);char* buffer = new char[fileSize];file.read(buffer, sizeof(char)*fileSize);// 打印读取到的数据(以十六进制的形式)for (int i = 0; i < fileSize;){//if (i % 16 != 0)if (i % 8 != 0){printf(" ");}printf("%02X", (unsigned char)buffer[i]);//std::cout << std::hex << static_cast<int>(static_cast<unsigned char>(buffer[i])) << " ";i++;//if (i % 16 == 0)if (i % 8 == 0){printf("\n");}}delete[] buffer;file.close();}else {std::cout << "Failed to open file." << std::endl;}return 0;
}

C语言,二进制数转为十进制数

#include<stdio.h>
#include<math.h>//二进制补码转十进制
int bin2dec()
{unsigned char binaryInteger[] = { 1, 0, 1, 1, 1, 1, 0, 1 };int s=0, i=0, j=0;int length = sizeof(binaryInteger) / sizeof(unsigned char);for (i = length - 1, j = 0; i >= 0; i--, j++){s = s + binaryInteger[i] * pow(2, j);}printf("无符号十进制整数为%d", s);//189//有符号的二进制补码转化为十进制 if (binaryInteger[0] == 1){//符号位为1 s = 0;for (i = length - 1, j = 0; i > 0; i--, j++){s += binaryInteger[i] * pow(2, j);}s = s - binaryInteger[0] * pow(2, length - 1);//符号位计算时取负值 }else{//符号位为0 s = 0;for (i = length - 1, j = 0; i >= 0; i--, j++){s = s + binaryInteger[i] * pow(2, j);}}printf("有符号十进制为%d", s);//-67return 0;
}

指定格式输出

#include<iostream>
#include<iomanip>using namespace std;int f_geshishuchu() 
{int a = 15;cout << std::oct << a << endl;//八进制cout << dec << a << endl;//十进制cout << hex << a << endl << endl;//十六进制//setw()指定域宽cout << setw(10) << 3.1415 << endl;//必须包含iomanip头文件  //默认用空格填补cout << setw(10) << setfill('a') << 3.1415 << endl << "\n";//setfill括号里的字符只能是一个,否则会报错//setionsflags确定对齐方式cout << setw(10) << setfill('a') << setiosflags(ios::left) << 3.1415 << endl;cout << setw(10) << setfill('a') << setiosflags(ios::right) << 3.1415 << endl << "\n";double b = 35.1415926535798;//setprecision指定精度,包含小数点前面的cout << setprecision(3) << setiosflags(ios::left) << b << endl;//35.1return 0;
}

C语言fread()函数:从文件读取数据

C语言中的 fread() 函数是一个标准库函数,用于从文件中读取数据。在本文中,我们将详细介绍 fread() 函数的用法、参数和返回值,并提供一些示例代码来帮助读者更好地理解该函数。

函数原型和语法

fread() 函数的函数原型和语法如下所示:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
参数:
ptr:指向要读取数据的缓冲区;
size:每个数据项的字节数;
count:要读取的数据项数目;
stream:指向文件流的指针。
返回值:函数返回一个 size_t 类型的值,表示成功读取的数据项数目。

函数作用

fread() 函数可以从文件中读取二进制数据。它在读取数据时,会从文件流中读取 count 个数据项,每个数据项占用 size 个字节。它会将这些数据项存储到由 ptr 指向的缓冲区中,并返回成功读取的数据项数目。

函数使用示例

下面是一个简单的使用 fread() 函数的示例程序。该程序将从文件中读取整型数据,并将它们打印到控制台上。

#include <stdio.h>int main()
{FILE *fp;int buffer[100];int count, i;fp = fopen("data.bin", "rb");if(fp == NULL){printf("Failed to open file\n");return 1;}count = fread(buffer, sizeof(int), 100, fp);printf("Read %d integers:\n", count);for(i = 0; i < count; i++){printf("%d\n", buffer[i]);}fclose(fp);return 0;
}

在上面的示例程序中,首先打开一个名为“data.bin”的文件,以二进制读取方式打开。如果文件打开失败,则会打印一条错误消息并返回 1。接下来,程序将从文件中读取 100 个整型数据,并将它们存储在 buffer 数组中。读取完数据后,程序打印出读取的数据项数目,并将每个整数打印到控制台上。最后,程序关闭文件并返回 0。

注意事项

在使用 fread() 函数时,需要注意以下几点:

  • 如果文件流中的数据不足以满足要求,则函数只会读取尽可能多的数据,并返回已经读取的数据项数目。如果读取的数据项数目小于 count,则有可能是文件结束了,也有可能是发生了错误。此时,可以使用 feof() 函数来判断是否是文件结束了,或者使用 ferror() 函数来判断是否发生了错误;
  • 如果函数读取的数据项数目等于 count,则无法判断文件是否结束,因此需要在程序中自行判断是否到达了文件末尾;
  • 在使用 fread() 函数时,需要确保缓冲区足够大,以存储要读取的数据。如果缓冲区太小,则会导致数据被截断,从而影响程序的正确性;
  • 如果要读取的数据类型是结构体或者其他自定义类型,则需要注意字节对齐的问题。如果结构体中包含有填充字节,则 fread() 函数在读取数据时也会读取这些填充字节,从而影响程序的正确性。可以使用 #pragma pack(n) 指令来控制字节对齐的方式;
  • 在使用 fread() 函数时,需要确保文件已经打开并且以正确的方式打开。如果文件未打开或者打开方式错误,则 fread() 函数将无法正常工作。

总结

本文介绍了 C语言中的 fread() 函数的用法、参数和返回值。该函数可以从文件中读取二进制数据,并将数据存储到指定的缓冲区中。在使用该函数时,需要注意缓冲区的大小、数据类型的字节对齐、文件是否已经打开等细节问题。本文提供了一个简单的示例程序,帮助读者更好地理解 fread() 函数的用法。

http://www.lryc.cn/news/332504.html

相关文章:

  • 【ZZULIOJ】1038: 绝对值最大(Java)
  • 递归算法讲解2
  • 机器学习第33周周报Airformer
  • 设计模式(12):代理模式
  • 前端9种图片格式基础知识, 你应该知道的
  • ChatGPT 与 OpenAI 的现代生成式 AI(上)
  • 全量知识系统 程序详细设计之架构设计:一个信息系统架构
  • 从零开始:成功进入IT行业的方法与技巧
  • SpringCloud - 如何本地调试不会注册到线上环境(Nacos)?
  • 1.9 面试经典150题 除自身以外数组的乘积
  • 【美团笔试题汇总】2023-09-02-美团春秋招笔试题-三语言题解(CPP/Python/Java)
  • 小黑逆向爬虫探索与成长之路:小黑独立破解毛毛租数据加密与解密
  • Generative Question-Answering with Long-Term Memory
  • 深入浅出 -- 系统架构之微服务架构常见的六种设计模式
  • SSM框架学习——SqlSession以及Spring与MyBatis整合
  • 6、【单例模式】确保了一个类在程序运行期间只有一个实例
  • vuex插件实现数据共享
  • 【吊打面试官系列】Redis篇 - 使用过 Redis 分布式锁么,它是什么回事?
  • DashOJ-8.奇偶统计
  • 车源宝微信小程序源码
  • “双碳”目标下资源环境中的可计算一般均衡(CGE)模型应用
  • 在 Git Bash 中调整字体大小,可以按照以下步骤进行操作,注意这里是linux虚拟机,命令都是Linux方式的
  • STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)
  • Codeforces Round 836 (Div. 2) D. Range = √Sum
  • 阿里云python-SDK配置
  • 深入理解MP4视频文件裁剪原理[下下]
  • Java中copy 一个list,不用BeanUtils.copyProperties
  • Vue3中props和emits的使用总结
  • HUAWEI 华为交换机 配置 Eth-Trunk 接口流量本地优先转发示例(堆叠)
  • MySQL 优化及故障排查