C++ 的最佳二进制 reader?
Best Binary reader for C++?
我在网上寻找读取二进制文件的最佳方式,它们都指向 ifstream 或 istream。
我不是说他们不好,而是我相处不来。很多,因为我只能读数字。
我正在寻找 C++ 中 C# 的 BinaryReader 的一些等价物,即使它更难,我也想在任何地方找到一些指导方针,我只能找到阅读完整文件缓冲区的人的指南,而不是还有很多
我尝试使用 C# 中的 System::IO 二进制文件 reader,但由于我使用互斥锁,我无法转到该选项。
我是这样读的。
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 != '[=13=]')
{
ch = file.get();
str += ch;
}
return str;
}
在这一点上,我以为我会得到我要找的东西,但我只是得到了琴弦上的数字。
日志:
Name: 1288880
Parent Name: 1288880
而且它们根本不共享相同的名称,所以我现在很困惑,我不想想象当我尝试阅读花车时我将如何做到这一点。
我知道这不是方法,我敢打赌有更好的方法,但我在互联网上找不到它,是一遍又一遍的相同教程,我不知道怎么做,或者我做的不对,单独学习 C++ 很难...
如果有人能给我一些关于如何学习解析基本数据(如浮点数、空终止字符串)的指导,如果有更好的方法读取整数,我将非常感激,我我很迷茫,我不知道该怎么办。
非常感谢
您可以使用std::getline
读入std::string
。您可以指定字符串结尾字符或使用默认换行符。
读取文件的最佳方法是读取大块,然后从内存中操作这些块。这减少了对输入流的请求数。
可以使用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;
}
我在网上寻找读取二进制文件的最佳方式,它们都指向 ifstream 或 istream。
我不是说他们不好,而是我相处不来。很多,因为我只能读数字。
我正在寻找 C++ 中 C# 的 BinaryReader 的一些等价物,即使它更难,我也想在任何地方找到一些指导方针,我只能找到阅读完整文件缓冲区的人的指南,而不是还有很多
我尝试使用 C# 中的 System::IO 二进制文件 reader,但由于我使用互斥锁,我无法转到该选项。
我是这样读的。
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 != '[=13=]')
{
ch = file.get();
str += ch;
}
return str;
}
在这一点上,我以为我会得到我要找的东西,但我只是得到了琴弦上的数字。 日志:
Name: 1288880
Parent Name: 1288880
而且它们根本不共享相同的名称,所以我现在很困惑,我不想想象当我尝试阅读花车时我将如何做到这一点。
我知道这不是方法,我敢打赌有更好的方法,但我在互联网上找不到它,是一遍又一遍的相同教程,我不知道怎么做,或者我做的不对,单独学习 C++ 很难...
如果有人能给我一些关于如何学习解析基本数据(如浮点数、空终止字符串)的指导,如果有更好的方法读取整数,我将非常感激,我我很迷茫,我不知道该怎么办。
非常感谢
您可以使用std::getline
读入std::string
。您可以指定字符串结尾字符或使用默认换行符。
读取文件的最佳方法是读取大块,然后从内存中操作这些块。这减少了对输入流的请求数。
可以使用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;
}