Создание нового текстового файла во вновь созданной папке

#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 действительно не имел значения. В соответствии с тем, что я хотел сделать с файлом — просто создайте его. После этого функция завершается, и после повторного доступа к ней эти файлы будут доступны для работы.

Спасибо вам обоим за решение моей проблемы.