Итак, в настоящее время я пишу линейный редактор в качестве учебного проекта по вводу-выводу, написанию файлов и тому подобному. Он написан на 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
Проблема в том, что 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
,
Ваш filename
переменная указывает на argv[1]
если указан аргумент командной строки, ему не нужно выделять память, а при входе в else
блок, вы не выделили память filename
, Это просто указатель.
использование malloc
назначить filename
немного памяти, затем принять пользовательский ввод.
filename = (char *)malloc(sizeof(char)*(FILE_NAME_LENGTH+1))