#c
#c
Вопрос:
Я хотел бы иметь возможность создать новую папку и сразу после этого создать новый текстовый файл внутри нее. Создание папки работает нормально, но создание текстового файла всегда завершается неудачей.
string ph = USER_INPUT;
USER_INPUT.clear();
cout << "n Write the name/ID of a lesson. Write 'cancel' to cancel.nn Lesson: ";
while (USER_INPUT == "" and USER_INPUT != "cancel")
{
getline(cin,USER_INPUT);
}
string ph2 = USER_INPUT;
string pathholder = "school\" ph;
const char *pathcreator = pathholder.c_str();
mkdir(pathcreator);
pathholder = "school\" ph "\" ph2 ".txt";
fstream file;
file.open(pathcreator);
Когда я распечатываю pathcreator, как только он содержит желаемый путь .txt, он записывает его просто отлично, поэтому у меня должна быть ошибка в моем коде, но я не могу понять, где.
Пожалуйста, помогите.
Комментарии:
1. Обратите внимание, что вы вызываете
file.open(pathcreator)
, а неfile.open(pathholder)
.
Ответ №1:
mkdir устарел, предпочитайте _mkdir . Избегайте использования пространства имен std, если только в бессмысленных примерах кода. Я немного почистил ваш код, пытаясь сохранить его форму. Если вы не смогли создать свой файл, это могло быть связано с флагами по умолчанию fstream
. Вы хотите ввести или вывести в файл или и то, и другое? этот код будет выполнять вывод в файл. смотрите это для получения дополнительной информации о флагах: http://www.cplusplus.com/reference/fstream/fstream/open / вы также можете открыть с помощью fstream как таковой : file.open(fileplace,fstream::out);
#include <fstream>
#include <sstream>
#include <direct.h>
using namespace std;
void foo() {
string pathToFolder = "C:\";
string innerFolder;
string fileName = "aFile";
cout << "n Write the name/ID of a lesson. Write 'cancel' to cancel.nn Lesson: ";
while (innerFolder == "" and innerFolder != "cancel")
{
getline(cin, innerFolder);
}
pathToFolder = innerFolder; //use = to append string or const char * to string
int error = _mkdir(pathToFolder.c_str());
if (error == 0)
cout << "folder created" << endl;
else
cout << "error creating folder" << endl;
string fileplace = pathToFolder;
fileplace = "\";
fileplace = fileName = ".txt";
ofstream file;
file.open(fileplace);
if (file.is_open())
cout << "file created" << endl;
else
cout << "couldn't create file" << endl;
}
void main() {
foo();
system("pause");
}
Ответ №2:
В этой строке:
const char *pathcreator = pathholder.c_str();
Вы получаете char*
указатель на внутренние данные для pathholder
, присваиваете его pathcreator
, а затем передаете pathcreator
mkdir()
. Пока все в порядке.
Но затем в этой строке:
pathholder = "school\" ph "\" ph2 ".txt";
Вы изменяете внутренние данные pathholder
, делая недействительными pathcreator
, но pathcreator
впоследствии вы используете эту строку, что является неопределенным поведением:
file.open(pathcreator);
Я предлагаю вам pathcreator
полностью избавиться от него и просто использовать pathholder.c_str()
непосредственно в вызовах mkdir()
и open()
:
string pathholder = "school\" ph;
mkdir(pathholder.c_str());
pathholder = ("\" ph2 ".txt");
fstream file;
file.open(pathholder.c_str());
Ответ №3:
Спасибо как пользователю, так и Remy. В итоге я использовал оба ваших предложения, и окончательный код закончился так:
string ph = USER_INPUT;
USER_INPUT.clear();
cout << "n Write the name/ID of a lesson. Write 'cancel' to cancel.nn Lesson: ";
while (USER_INPUT == "" and USER_INPUT != "cancel")
{
getline(cin,USER_INPUT);
}
string ph2 = USER_INPUT = ".txt";
string pathholder = "school\" ph;
_mkdir(pathholder.c_str());
pathholder = "\" ph2;
ofstream file;
file.open(pathholder.c_str());
file.close();
if (USER_INPUT != "cancel")
cout << "n Subject added to database.nnn ";
Я не знал, что xyz.c_str() может использоваться для определения переменной создания x). Зная это, pathcreator действительно не имел значения. В соответствии с тем, что я хотел сделать с файлом — просто создайте его. После этого функция завершается, и после повторного доступа к ней эти файлы будут доступны для работы.
Спасибо вам обоим за решение моей проблемы.