C ++的最佳二进制阅读器?

时间:2015-01-16 00:41:26

标签: c++ parsing binary 3dsmax

我通过互联网查看阅读二进制文件的最佳方式,它们都会导致ifstream或istream。

我并不是说他们不好,但我无法与之相提并论。很多,因为我只能设法阅读数字。

我正在寻找C ++中C#的BinaryReader的等价物,即使它更难,我想在任何地方找到一些指导方针,我只能找到人们阅读完整文件缓冲区的指南而不是其他

我尝试使用C#的System :: IO二进制阅读器,但由于我使用互斥锁,我无法使用该选项。

以下是我正在阅读的内容。

std::ifstream f(filename, std::ios::binary); //Open the file

f.read((char*)&header, sizeof(4)); //ReadInt32

SCNObject obj(f);

构造函数:

SCNObject::SCNObject(std::ifstream& f)
{
    f.read((char*)&ID, sizeof(4));
    name = (ReadString(f));
    parentName = (ReadString(f));
}

我的ReadString函数:

std::string ReadNTString(std::ifstream& file)
{
    char ch = 0;
    std::string str = "";
    while (ch != '\0')
    {
        ch = file.get();
        str += ch;
    }
    return str;
}

此时我以为我会得到我想要的东西,但我只是在字符串上有数字。 经度:

Name: 1288880
Parent Name: 1288880

他们根本没有相同的名字,所以我现在很困惑,我不想想当我尝试阅读花车时我将如何制作它。

我知道这不是这样做的方式,我打赌有一种更好的方法,但我只是在互联网上找不到它,是一遍又一遍的同一个教程我不喜欢得到怎么做,或者我做得不对,单独学习c ++很难......

如果有人可以给我一些关于如何学习解析浮点数,空终止字符串等基本数据的指导,并且如果有更好的方式读取这样的话,我会非常感激,我是如此迷失,我不知道该怎么做。

提前多多感谢

2 个答案:

答案 0 :(得分:0)

您可以使用std::getline来阅读std::string。您可以指定字符串结尾字符或使用默认换行符。

从文件读取的最佳方法是读取大块,然后从内存中操作这些块。这减少了对输入流的请求数。

答案 1 :(得分:0)

您可以使用boost的序列化库

http://www.boost.org/doc/libs/1_57_0/libs/serialization/doc/index.html

它支持c ++原语和STL容器的二进制序列化,并提供了一个框架,用于将序列化扩展到您自己的类型。 (但请记住,它不能在不同的机器架构中移植)

这里是简单字符串和浮点数的序列化。

//writer.cpp
#include <boost/serialization/string.hpp>                                                       
#include <boost/archive/binary_oarchive.hpp>                                                    
#include <fstream>                                                                              

int main() {                                                                                    
  std::ofstream out("mydata.bin");                                                              
  boost::archive::binary_oarchive oarchive(out);                                                
  std::string s = "abc";                                                                        
  float x = 123.0f;                                                                             
  oarchive << s << x;                                                                           
  return 0;                                                                                     
} 

//reader.cpp
#include <boost/serialization/string.hpp>                                                       
#include <boost/archive/binary_iarchive.hpp>                                                    
#include <fstream>                                                                              

int main() {                                                                                    
  std::ifstream in("mydata.bin");                                                               
  boost::archive::binary_iarchive iarchive(in);                                                 
  std::string s;                                                                                
  float x;                                                                                      
  iarchive >> s >> x;                                                                           
  std::cout << s << x << '\n';                                                                  
  return 0;                                                                                     
}