C ++ строка слишком большая, завершающие символы усекаются

Я делаю программу, которая при запуске будет записывать предопределенную строку в файл. Размер файла составляет около 5 МБ, поэтому заполнение строки 5 МБ данных в шестнадцатеричном формате — большая переменная. Когда я пытаюсь его скомпилировать, я получаю сообщение о том, что строка слишком велика. 5 МБ действительно большой? Я разделил строку на 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();

8

Решение

Стандарт не определяет максимальная предел строковых литералов, но предлагает минимальный размер. От Приложение B — Количество реализации

Пределы могут ограничивать количества, которые включают те, которые описаны ниже или другие. Число в скобках после каждого количества рекомендуется как минимальное для этого количества. Однако эти количества являются только ориентировочными и не определяют соответствие.

  • Символы в строковом литерале (после конкатенации) [65 536].

Однако в том же разделе стандарта также говорится следующее

Поскольку компьютеры являются конечными, реализации C ++ неизбежно ограничены в размерах программ, которые они могут успешно обрабатывать. Каждая реализация должна документировать те ограничения, где они известны. Эта документация может ссылаться на фиксированные ограничения там, где они существуют, например, как вычислять переменные ограничения как функцию от доступных ресурсов, или говорить, что фиксированные ограничения не существуют или неизвестны.

Можно с уверенностью предположить, что строковый литерал размером 5 МБ превысит максимальные ограничения, установленные компилятором. Вам следует обратиться к документации вашей цепочки инструментов, чтобы определить, какие ограничения накладываются на строковые литералы.

Если вы используете компилятор Visual C ++, максимальный размер строкового литерала составляет 16 384 байтов. От Документация MSDN

Максимальная длина строкового литерала составляет 16 384 (16 КБ) байтов. Это ограничение применяется к строкам типа char [] и wchar_t []. Если строковый литерал состоит из частей, заключенных в двойные кавычки, препроцессор объединяет части в одну строку и для каждой объединенной строки добавляет дополнительный байт к общему количеству байтов.

10

Другие решения

Если вы пытаетесь быть быстрым и грязным, используйте для этого уровень ввода-вывода С 3 и статический массив для хранения значений.

#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

вместо этого :

char* metaDescriptor = "very long string";

так должно быть :

char* metaDescriptor = "very long""string";
1
По вопросам рекламы [email protected]