bin文件读写 - C/C++

本文详细介绍了如何使用C和C++语言读取和保存bin文件,包括基本的文件操作、C/C++版本的函数实现以及实际调用示例,帮助开发者解决网络推理定位问题中的数据转换需求。

本文介绍一下 C 和 C++ 读取和保存 bin 文件的方法。

  bin 文件的存取在调试网络推理定位问题的时候可能会经常用到,如在这个框架里网络输出和预期对不上,经常需要把这个网络里的前处理输出、网络推理输出搬到另外的框架里走一遍,来确定是前处理有问题,还是网络推理有问题,还是后处理有问题。这里分享一下 C 语言和 C++ 读取和保存特征数据为 bin 文件的方法。其实大部分情况可以用 C++ 搞定,但如 darknet 这种纯 C 框架可能就需要用 C 实现。文章目录
1、C 读取和保存 bin 文件
1.1 C 读取
1.2 C 保存
1.3 C 调用
2、C++ 读取和保存 bin 文件
2.1 C++ 读取
2.2 C++ 保存
2.3 C++ 调用
1、C 读取和保存 bin 文件
1.1 C 读取
/// C 读取bin文件

int getBinSize(char *path)
{
    int  size = 0;
    FILE  *fp = fopen(path, "rb");
    if (fp)
    {
        fseek(fp, 0, SEEK_END);
        size = ftell(fp);
        fclose(fp);
    }
    printf("\npath=%s,size=%d \n", path, size);
    return size;
}

void readBin(char *path, char *buf, int size)
{
    FILE *infile;

    if ((infile = fopen(path, "rb")) == NULL)
    {
        printf("\nCan not open the path: %s \n", path);
        exit(-1);
    }
    fread(buf, sizeof(char), size, infile);
    fclose(infile);
}


1.2 C 保存
/// C 保存bin文件

void writeBin(char *path, char *buf, int size)
{
    FILE *outfile;

    if ((outfile = fopen(path, "wb")) == NULL)
    {
        printf("\nCan not open the path: %s \n", path);
        exit(-1);
    }
    fwrite(buf, sizeof(char), size, outfile);
    fclose(outfile);
}


1.3 C 调用

// read binFile
char filePath[] = "./demo.bin";
int size = GetBinSize(filePath);
char *buf = (char*)malloc(size);
readBin(filePath, buf, size);
float *fbuf = (float*)buf;

// write binFile
char saveFilePath[] = "./demo_saved.bin"
writeBin(saveFilePath, buf, size)

free(buf)

2、C++ 读取和保存 bin 文件
2.1 C++ 读取

/// C++ 读取bin文件
void getBinSize(std::string path)
{
    int size = 0;
    std::ifstream infile(path, std::ifstream::binary);
    
    infile.seekg(0, infile.end);
    int size= infile.tellg();
    infile.seekg(0, infile.beg);
    
    infile.close();
    printf("\npath=%s,size=%d \n", path, size);
    return size;
}

void readBin(std::string path, char *buf, int size)
{
  std::ifstream infile(path, std::ifstream::binary);

  infile.read(static_cast<char *>(buf), size);
  infile.close();
}


2.2 C++ 保存

/// C++ 保存bin文件
void writeBin(std::string path, char *buf, int size)
{
  std::ofstream outfile(path, std::ifstream::binary);

  outfile.write((char *)(buf), size);

  outfile.close();
}


2.3 C++ 调用

// read binFile
std::string filePath= "./demo.bin";
int size = GetBinSize(filePath);
char *buf= new char[size];
readBin(filePath, buf, size);
float *fbuf = reinterpret_cast<float *>(buf);

// write binFile
std::string saveFilePath= "./demo_saved.bin";
writeBin(saveFilePath, buf, size);

delete buf;

2. 文件读出成char

//C方式, 调用的函数繁多
//fopen,fseek,ftell,fseek,malloc,fread,fclose,free.
void foo()
{
    FILE* fp=fopen(sFileName,"rb");
    fseek(fp,0,SEEK_END);
    int len = ftell(fp);
    fseek(fp,0,SEEK_SET);
    char* s = (char*)malloc(len);
    fread(s,1,len,fp);
    fclose(fp);
    fwrite(s,1,len,stdout);//output
    free(s);
}
//C++方式,易懂
void foo()
{
    ifstream fs(sFileName.c_str(),ios::binary);
    stringstream ss ;     
    ss << fs.rdbuf();
    fs.close();
    string str = ss.str();//read into string
}
//C++方式,高大上
//string的构造用了一个模版函数
void foo()
{
    std::ifstream ifs(sFileName.c_str());
    std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>(0));
    ifs.close();
}
[test.cpp] /home/zhouweixiang/cpptest/cpptest/bin/engine/bin/xharness --native-options-start -I/home/zhouweixiang/cpptest/cpptest/bin/engine/runtime/include -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/nlohmann -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/jni -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/inc -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/jni/inc -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/socket/inc -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/kalman/include -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/inc -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/sqlite3/inc -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/convert -I/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/ISA_Engine/adas -std=c++14 -c -DPARASOFT_CPPTEST --native-options-end --input=/home/zhouweixiang/test/git/code/03IMPLEMENT/0301Code/ISA_engine/test.cpp --xharness.outputFileName=/home/zhouweixiang/cpptest-work-space/.cpptest/my_project/file-data/test.cpp9bb37f72/adds/harness_test.cpp --compiler-cfg-file=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/compilers/gcc_9-64/cpp.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_coverage.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_callbacks.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_befriend.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_stubcall.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_renamemain.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_memory_analysis.psrc --psrc=/home/zhouweixiang/cpptest/cpptest/bin/engine/etc/xharness_features_symbols.psrc --psrc=/home/zhouweixiang/cpptest-work-space/.cpptest/my_project/file-data/test.cpp9bb37f72/adds/instr_flow_step.psrc --psrc=/home/zhouweixiang/cpptest-work-space/.cpptest/my_project/unit-data/current_tubf179707/advanced_opts.psrc [bundled_update.cpp] /home/zhouweixiang/cpptest-work-space/.cpptest/my_project/file-data/update.cpp48cdf0f4/bundled_update.cpp:4:10: fatal error: /home/zhouweixiang/cpptest-work-space/my_project/tests/autogenerated/ISA_engine/src/测试用例/tests/autogenerated/ISA_engine/src/TestSuite_update_cpp.cpp: 没有那个文件或目录 4 | #include "/home/zhouweixiang/cpptest-work-space/my_project/tests/autogenerated/ISA_engine/src/测试用例/tests/autogenerated/ISA_engine/src/TestSuite_update_cpp.cpp" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. Error preprocessing file "/home/zhouweixiang/cpptest-work-space/.cpptest/my_project/file-data/update.cpp48cdf0f4/bundled_update.cpp": Process exited with status: 1 Could not preprocess source file [bundled_update.cpp] ...失败.
07-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值