17

我正在制作一个程序,该程序在启动时会将预定义的字符串写入文件。该文件的大小约为 5 mb,因此用 5 mb 的十六进制数据填充字符串是一个很大的变量。当我尝试编译它时,我收到一个错误,说字符串太大。5mb真的那么大吗?我将字符串分成 4 个部分,但每个部分仍然太大。:/我可以快速轻松地解决这种情况。

注意:我认为自己是一个初学者程序员,所以尽量不要太过分:P

我如何将字符串写入文件的示例:

string file_hex("huge_a**_string_goes_here_or_in_separate_cpp");

ofstream file_out;
file_out.open("tools\\c.exe", ios::binary | ios::trunc);
string res;
res.reserve(file_hex.size() / 2);
for (int i = 0; i < file_hex.size(); i += 2)
{
    std::istringstream iss(file_hex.substr(i, 2));
    int temp;
    iss >> std::hex >> temp;
    res += static_cast<char>(temp);
}

file_out << res;
file_out.close();
4

3 回答 3

17

该标准没有指定字符串文字的最大限制,但确实建议了最小大小。来自附件 B - 实施数量

这些限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。

  • 字符串文字中的字符(连接后)[65 536]。

然而,标准中的同一部分还规定了以下内容

因为计算机是有限的,C++ 实现不可避免地受限于它们可以成功处理的程序的大小。每个实施都应在已知的情况下记录这些限制。本文档可能会引用存在的固定限制,说明如何根据可用资源计算可变限制,或者说固定限制不存在或未知。

可以安全地假设 5MB 字符串文字将超过编译器施加的最大限制。您应该参考工具链的文档来确定对字符串文字施加的限制。

如果您使用 Visual C++ 编译器,则字符串文字的最大大小为 16,384字节。来自MSDN 文档

字符串文字的最大长度为 16,384 (16K) 字节。此限制适用于 char[] 和 wchar_t[] 类型的字符串。如果字符串文字由用双引号括起来的部分组成,则预处理器将这些部分连接成一个字符串,并且对于连接的每一行,它会在总字节数中添加一个额外的字节。

于 2013-06-01T03:36:38.237 回答
8

而不是这个:

char* metaDescriptor = "very long string";

它应该是 :

char* metaDescriptor = "very long"
                        "string";
于 2014-01-22T13:42:14.793 回答
2

如果您只想快速而肮脏,请使用 C 的 3 级 IO 来执行此操作并使用静态数组来存储值。

#include <stdio.h>

static const unsigned char data[] = {
    1, 5, 255, 128, 50, 192,
    // all the values of your file here,
    // don't add a trailing zero, this is not a string.
};

int main(int argc, const char* argv[])
{
    FILE* fp = fopen("test.txt", "wb");
    if ( fp == NULL ) {
        printf("No dice.\n");
        return -1;
    }
    // write the entire array to the file without.
    fwrite(data, sizeof(data[0]), sizeof(data), fp);
    fclose(fp);
    return 0;
}
于 2013-06-01T04:23:20.127 回答