Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+的最佳二进制读取器+;?_C++_Parsing_Binary_3dsmax - Fatal编程技术网

C++ C+的最佳二进制读取器+;?

C++ C+的最佳二进制读取器+;?,c++,parsing,binary,3dsmax,C++,Parsing,Binary,3dsmax,我在互联网上寻找读取二进制文件的最佳方法,它们都会导致ifstream或istream 我不是说他们不好,但我无法与他们相处。很多,因为我只能读数字 我在C++中寻找一些C的BinaryReader,即使它更难,我想在任何地方找到一些指南,我只能找到人们阅读完整文件缓冲区的指南,而不是其他的< 我尝试使用C#中的System::IO二进制读取器,但由于我使用互斥,所以无法使用该选项 下面是我读这些东西的方式 std::ifstream f(filename, std::ios::binary);

我在互联网上寻找读取二进制文件的最佳方法,它们都会导致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;
}
在这一点上,我想我会得到我想要的,但我只是得到了字符串上的数字。 日志:

而且它们根本没有相同的名字,所以我现在很困惑,我不想想象当我尝试阅读浮动时我将如何做到这一点

<>我知道这不是办法,我打赌有更好的方法,但我在网上找不到,是一遍又一遍的一遍一遍的教程,我不知道怎么做,或者我做不好,只学习C++是很难的…… 如果有人能给我一些指导,教我如何解析浮点数、以null结尾的字符串等基本数据,如果有更好的方法读取ints,我会非常感激,我太迷茫了,不知道该怎么办


提前非常感谢

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


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

您可以使用boost的序列化库

它支持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;                                                                                     
}  
//writer.cpp
#包括
#包括
#包括
int main(){
std::流输出(“mydata.bin”);
boost::archive::binary_oarchive oarchive(out);
std::string s=“abc”;
浮动x=123.0f;
欧香s>>x;

std::cout Fyi,
sizeof(4)
?您是打算读取保证的4字节,还是使用整型常量
4
以某种方式发送
sizeof(int)
(这就是它实际执行的操作)?通常的模式是
f.read(重新解释转换(&header),sizeof header)
。难看的语法让你在设计时感到不安,因为这不一定是可移植的。我喜欢定义一个
读取
函数,该函数与
std::is_平凡
(或者
std::is_平凡_可复制
,如果你的库支持的话)为了确保我不在非平凡类中使用它。4是为了确保我读取的是4个字节,但我从未想过使用int的大小,谢谢:P是的,我的库支持它,我可以检查它并使用它!@SeyrenWindsor从你的反应来看,我认为你不理解我的评论。
sizeof(4)
sizeof(int)
,正如
4
就是这样;一个
int
。如果你想准确地读取4个八位字节,那么这就是你要传递的:4.在这种情况下没有
sizeof
。如果这是一个固定格式的文件,可能由多个平台写入和读取,
sizeof(int)不是你应该使用的。哦,我错了,对不起,我理解它是错误的,那么我做的方式是正确的,正如你所说的,这是一个固定格式文件,它将在3D引擎中被编码,我已经在C++中编码了它,但是我对学习这门语言感兴趣。3ds max只在插件中使用C++。阅读代码似乎正是我所需要的浮点数和字符串!我要尝试一下,我会让你知道!我有很多错误和异常后,把它放进去,特别是语法可能是我的错,我不能继续今天,我会让你明天,但似乎这可能是我要找的东西,谢谢!
//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;                                                                                     
}