我正在使用mpz_class(使用MPIR 2.5.1和Visual Studio C ++ 2010,以及MPIR的C ++版本),对我来说,在内存中存储大量数据是不可行的,所以我想用二进制文件来做
我已经用文本文件完成了这个,但是当我使用100,000多个位数时,二进制文件应该(希望)可以节省大量空间。
我写了一个简短的例子来帮助你理解我正在做的事情:
ofstream binFile;
binFile.open ("binary.bin", ios::out | ios::binary);
mpz_class test;
test.set_str("999999999999999",10);
binFile.write((char *)(&test), sizeof(test));
cout << "NUMBER: " << test << "\tSIZE: " << sizeof(test) << endl;
binFile.close();
我正在尝试编写代表mpz_class实例的字符数据。然后,为了测试它,我试着读取文件:
ifstream binFile2;
binFile2.open("binary.bin", ios::in | ios::binary);
mpz_class num1 = 0;
binFile2.read ((char *)(&num1), sizeof(num1));
cout << "NUMBER: " << num1 << "\tSIZE: " << sizeof(num1) << endl;
binFile2.close();
我在网上看到的很多例子都使用这种方法将类数据存储到二进制文件中,但我的输出是:
NUMBER: 999999999999999 SIZE: 12
NUMBER: 8589934595 SIZE: 12
为什么我不能直接存储类数据,然后再读一遍? mpz_class的实例不可能是12的大小,这是指针的大小??
我也试过这个,但我认为这基本上是一样的:
char* membuffer = new char[12]; //sizeof(test) returned 12
binFile2.read (membuffer , sizeof(test));
memcpy(&test, &membuffer, sizeof(test))
如何解决这个问题的任何建议将不胜感激。感谢。
答案 0 :(得分:1)
我认为您需要花更多时间阅读GMP手册(第12.1节):
没有完成从类到标准C ++类型的转换 自动,而是提供像get_si这样的成员函数(参见 以下部分详细介绍。)
因此,您可能需要做的是致电mpz_class::get_str
和mpz_class::set_str
。无论如何,C ++接口只是C API的一个轻量级包装器,所以你可能最好使用低级别的东西,因为它的记录要好得多。在这种情况下,您必须使用mpz_get_str
和mpz_set_str
(对于整数)。
请记住,没有可以提供GMP数据类型的直接二进制序列化的API函数,因此您需要使用字符串。我不确定这些野兽的大小是否存在某些限制,因此如果您计划使用如此大的数字,则应彻底测试您的代码。也许最好的选择是在base 62中提取一个字符串表示(允许的最大值),这样它就不会炸掉你的内存(在base 2中它会占用每个字节一个字节),然后将其写入文件。