我的DLL再次出现了一些问题:
我尝试将一个数字(在本例中为“20”)转换为可以写入文件的char。 无论以何种方式完成此操作都无关紧要(无论是否遵循ascii-table),但我还需要一种转换方式。
这是我的尝试:
file.write((char*)20,3);
但它正在抛出访问暴力错误..
有人可以告诉我这是如何完成的,以及我如何扭转这一过程? 我也可以使用一个大于255的数字的方法,结果是两个或三个字符(两个字符= 16位数字。
有人有想法吗?
答案 0 :(得分:2)
如果您只想写一个任意字节,可以这样做:
file.put(20);
或
char ch = 20;
file.write(&ch, 1); // Note a higher digit than 1 here will mean "undefined behaviour".
要撤消此过程,您需要使用file.get()
或file.read(&ch, 1)
。
对于大于单个字节的单位,你必须使用file.write(...)
,但它的可移植性较差,因为它现在依赖于不同平台之间的值相同的大小,而内部表示是一样的。如果你总是在同一类型的机器上运行它(例如x86处理器上的Windows),这不是问题,但如果你开始在不同类型的机器上使用代码(x86,Sparc, ARM,IBM大型机,移动电话DSP等),也可能介于不同的操作系统之间。
这样的事情将适用于上述限制:
int value = 4711;
file.write((char *)&value, sizeof(value));
将此值写入文本形式的文件更加便携,除了识别相同的字符编码之外,任何其他计算机都可以读取该文件。
答案 1 :(得分:0)
这将根据数字的大小将unsigned long long
转换为多个字符,并将它们输出到文件中。
#include <fstream>
int main() {
unsigned long long number = 2098798987879879999;
std::ofstream out("out.txt");
while (number) { // While number != 0.
unsigned long long n = number & 255; // Copy the 8 rightmost bits.
number >>= 8; // Shift the original number 8 bits right.
out << static_cast<unsigned char>(n); // Cast to char and output.
}
out << std::endl; // Append line break for every number.
}
你可以使用类似的东西从文件中读回来
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
int main() {
std::ifstream in("out.txt");
unsigned long long number = 0;
std::string s;
std::getline(in, s); // Read line of characters.
std::reverse(begin(s), end(s)); // To account for little-endian order.
for (unsigned char c : s) {
number <<= 8;
number |= c;
}
std::cout << number << std::endl;
}
此输出
2098798987879879999