Строка C++ слишком большая, конечные символы усечены

Я делаю программу, которая при запуске будет писать стандартную строку в файл. Размер файла составляет около 5 Мб, поэтому заполнение строки 5 Мб данных в hex является большой переменной. Когда я пытаюсь скомпилировать его, я получаю ошибку, говоря, что строка слишком велика. 5mb действительно настолько большой? Я разделил строку на 4 раздела, но каждый раздел все еще слишком велик. :/ что я могу быстро и легко сделать, чтобы исправить эту ситуацию.

примечание: Я считаю себя начинающим программистом, поэтому стараюсь не идти слишком далеко над моей головой: P

пример того, как я пишу строку в файл:

string file_hex("huge_a**_string_goes_here_or_in_separate_cpp");

ofstream file_out;
file_out.open("toolsc.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();

3 ответов


в стандарте не указывается максимум предел строковых литералов, но предлагает минимум размер. От приложение B-количество реализации

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

  • символы в строковом литерале (после объединения) [65 536].

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

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

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

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

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


Если вы пытаетесь просто быть быстрым и грязным, используйте 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;
}

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

char* metaDescriptor = "very long string";

должно быть :

char* metaDescriptor = "very long"
                        "string";