我正在创建一个程序,在启动时,会将预定义的字符串写入文件。该文件大小约为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();
答案 0 :(得分:11)
标准没有指定字符串文字的最大限制,但确实建议最小大小。来自附件B - 实施数量
限制可能会限制包含下述数量或其他数量的数量。建议将每个数量后面的括号内的数字作为该数量的最小值。但是,这些数量仅是指导原则,不能确定合规性。
- 字符串文字中的字符(连接后)[65 536]。
然而,标准中的相同部分也陈述以下内容
由于计算机是有限的,因此C ++实现不可避免地受限于它们可以成功处理的程序的大小。每个实施都应记录已知的限制。本文档可引用存在的固定限制,说明如何根据可用资源计算变量限制,或者说固定限制不存在或未知。
可以安全地假设5MB字符串文字将超过编译器强加的最大限制。您应该参考工具链的文档来确定对字符串文字施加的限制。
如果您使用的是Visual C ++编译器,则字符串文字的最大大小为16,384 bytes 。来自MSDN documentation
字符串文字的最大长度为16,384(16K)字节。此限制适用于char []和wchar_t []类型的字符串。如果字符串文字由用双引号括起来的部分组成,则预处理器将这些部分连接成一个字符串,并且对于每个连接的行,它会在总字节数中添加一个额外的字节。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
而不是:
char* metaDescriptor = "very long string";
它应该是:
char* metaDescriptor = "very long"
"string";