2015-02-05 2 views
0

Я создал функцию для сохранения текстового файла с помощью <fstream>.не может инициализировать char в C++

void save(AnsiString flName, AnsiString &YourText) { 
    char saving[strlen(YourText.c_str())]; // << ERROR 

    strncpy(saving, YourText.c_str(), sizeof(saving) - 1); 

    ofstream ok(flName.c_str(), ios::out); 
    ok << saving; 
    ok.close(); 
} 

У меня есть проблемы в линии 2. сказали: Постоянного выражения требуется

вы можете мне помочь. есть ли другой более эффективный способ сохранения текстового файла?

+0

1. Посмотрите документацию «AnsiString». Ли 'c_str()' возвращает 'char'? 2. Посмотрите документацию 'strncpy'. Является первым параметром 'char'? – juanchopanza

+0

Закрытие вопроса, потому что оно подчеркивает VLA. Последняя строка должна была быть другим вопросом. – iammilind

ответ

1

Ошибка вызвана попыткой создания массива, который требует постоянного размера.

Чтобы исправить это, используйте std :: vector. Однако в вашем случае используйте это:

ofstream out(flName.c_str()); 
out << YourText; 

ОТВЕТ: Вам нужно прочитать учебное пособие по C++. Абсолютно. В вашем коде содержится так много проблем, которые трудно запускать, например, множественные одноразовые ошибки, невозможность использования строк в стиле C (т. Е. Строк с нулевым завершением) и недостаточного понимания управления ресурсами на C++ в целом. Кроме того, у вас нет обработки ошибок. Константа.

0

Вы не можете инициализировать массив динамических размеров. Вы должны создать его с помощью динамического распределения (например, таНос или новый)

Так что вам нужно:

void save(AnsiString flName, AnsiString &YourText) { 
    char* saving = new char[strlen(YourText.c_str())]; 

    strncpy(saving, YourText.c_str(), sizeof(saving) - 1); 

    ofstream ok(flName.c_str(), ios::out); 
    ok << saving; 
    delete[] saving; 
    ok.close(); 
} 

Stack распределения, необходимо знать размер того, что выделяется во время компиляции. Невозможно, чтобы компилятор знал длину своего текста раньше времени.

Этот код может быть значительно упрощен, но он выходит за рамки этого вопроса. Не стесняйтесь начинать чат, если хотите, чтобы некоторые указатели переписывали это.

0

Размер массива должен быть постоянным; Вы не можете инициализировать размер с помощью переменной

Смежные вопросы