C ++: cin & gt; & gt; * голец

Итак, в настоящее время я пишу линейный редактор в качестве учебного проекта по вводу-выводу, написанию файлов и тому подобному. Он написан на C ++, и в настоящее время я пытаюсь записать в файл по выбору пользователя. У меня реализованы аргументы CLI, но в настоящее время я понятия не имею, как реализовать программный способ указания файла для записи.

char *filename;
if (argc >= 2){
filename = argv[1];
} else{
cout << "file>";
cin >> filename;
cin.ignore();
}

Это прекрасно работает, когда я использую аргументы командной строки; однако всякий раз, когда я этого не делаю, как только я запускаю программу, возникает ошибка сегментации. Место, где я использую настоящее имя файла, находится в команде сохранения:

void save(char filename[], int textlen, string file[]){
ofstream out(filename);
out << filestring(textlen, file);
out.close();
}

Который также отлично работает. Можете ли вы помочь мне? Полный исходный код, для обзора, на https://github.com/GBGamer/SLED

2

Решение

Проблема в том, что char* filename это просто указатель на некоторую память, содержащую символы. Он не владеет никакой памятью.
Когда вы используете аргумент командной строки, программа обрабатывает где-то эту строку, и вы получаете указатель на нее. Когда вы пытаетесь читать с помощью cin >> filename на самом деле нет места для хранения прочитанных данных.

Решение: заменить char* filename с std::string filename (а также #include <string>).

Затем, чтобы открыть выходной файл, вам нужна строка в стиле c (null прекращается char массив). std::string имеет функцию для этого. Ты бы написал

std::ofstream out(filename.c_str());
^^^^^

Или, на самом деле, если вы можете использовать недавний компилятор с функциями C ++ 11, вам даже не нужно использовать c_str(), Новый std::ofstream конструктор был добавлен, чтобы принять std::string,

2

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

Ваш filename переменная указывает на argv[1] если указан аргумент командной строки, ему не нужно выделять память, а при входе в else блок, вы не выделили память filename, Это просто указатель.

использование malloc назначить filename немного памяти, затем принять пользовательский ввод.

filename = (char *)malloc(sizeof(char)*(FILE_NAME_LENGTH+1))
0