用于字符和写入文件的代码编号

时间:2013-07-19 17:03:14

标签: c++ file

我的DLL再次出现了一些问题:

我尝试将一个数字(在本例中为“20”)转换为可以写入文件的char。 无论以何种方式完成此操作都无关紧要(无论是否遵循ascii-table),但我还需要一种转换方式。

这是我的尝试:

file.write((char*)20,3);

但它正在抛出访问暴力错误..

有人可以告诉我这是如何完成的,以及我如何扭转这一过程? 我也可以使用一个大于255的数字的方法,结果是两个或三个字符(两个字符= 16位数字。

有人有想法吗?

2 个答案:

答案 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