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


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

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

    1. //C++读取bin二进制文件
    2. int read_bin()
    3. {
    4. std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);
    5. if (file)
    6. {
    7. // 按照二进制格式读取数据
    8. file.seekg(0, std::ios::end);
    9. long long fileSize = file.tellg();
    10. printf("size of firm: %lld\n", fileSize);
    11. // 将读写位置移动到文件开头,申请内存,将固件内容存入buffer
    12. file.seekg(0, std::ios::beg);
    13. char* buffer = new char[fileSize];
    14. file.read(buffer, sizeof(char)*fileSize);
    15. // 打印读取到的数据(以十六进制的形式)
    16. for (int i = 0; i < fileSize;)
    17. {
    18. //if (i % 16 != 0)
    19. if (i % 8 != 0)
    20. {
    21. printf(" ");
    22. }
    23. printf("%02X", (unsigned char)buffer[i]);
    24. //std::cout << std::hex << static_cast(static_cast(buffer[i])) << " ";
    25. i++;
    26. //if (i % 16 == 0)
    27. if (i % 8 == 0)
    28. {
    29. printf("\n");
    30. }
    31. }
    32. delete[] buffer;
    33. file.close();
    34. }
    35. else
    36. {
    37. std::cout << "Failed to open file." << std::endl;
    38. }
    39. return 0;
    40. }

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

    1. #include
    2. #include
    3. //二进制补码转十进制
    4. int bin2dec()
    5. {
    6. unsigned char binaryInteger[] = { 1, 0, 1, 1, 1, 1, 0, 1 };
    7. int s=0, i=0, j=0;
    8. int length = sizeof(binaryInteger) / sizeof(unsigned char);
    9. for (i = length - 1, j = 0; i >= 0; i--, j++)
    10. {
    11. s = s + binaryInteger[i] * pow(2, j);
    12. }
    13. printf("无符号十进制整数为%d", s);//189
    14. //有符号的二进制补码转化为十进制
    15. if (binaryInteger[0] == 1)
    16. {//符号位为1
    17. s = 0;
    18. for (i = length - 1, j = 0; i > 0; i--, j++)
    19. {
    20. s += binaryInteger[i] * pow(2, j);
    21. }
    22. s = s - binaryInteger[0] * pow(2, length - 1);//符号位计算时取负值
    23. }
    24. else
    25. {
    26. //符号位为0
    27. s = 0;
    28. for (i = length - 1, j = 0; i >= 0; i--, j++)
    29. {
    30. s = s + binaryInteger[i] * pow(2, j);
    31. }
    32. }
    33. printf("有符号十进制为%d", s);//-67
    34. return 0;
    35. }

    指定格式输出

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

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

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

    函数原型和语法

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

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

    函数作用

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

    函数使用示例

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

    1. #include
    2. int main()
    3. {
    4. FILE *fp;
    5. int buffer[100];
    6. int count, i;
    7. fp = fopen("data.bin", "rb");
    8. if(fp == NULL)
    9. {
    10. printf("Failed to open file\n");
    11. return 1;
    12. }
    13. count = fread(buffer, sizeof(int), 100, fp);
    14. printf("Read %d integers:\n", count);
    15. for(i = 0; i < count; i++)
    16. {
    17. printf("%d\n", buffer[i]);
    18. }
    19. fclose(fp);
    20. return 0;
    21. }

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

    注意事项

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

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

    总结

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

  • 相关阅读:
    大三实习生,字节跳动面经分享,已拿Offer
    大数据之ZooKeeper(一)
    Canal 实现MySQL与Elasticsearch7数据同步
    如何按照洁净区不同等级选择不同流量的粒子计数器设备?
    【regex】正则表达式
    [RoarCTF 2019]Simple Upload
    webrtc学习--了解webrtc服务器
    【无标题】
    WebGIS的认识及学习路线推荐!
    使用matplotlib画k线(2条k线同列)----附python源码
  • 原文地址:https://blog.csdn.net/yishuihanq/article/details/137257066