Хорошо спасибо за ответ Wug! Я изменил свой код, но теперь он жалуется:
нет соответствующей функции для вызова
станд :: basic_ofstream :: basic_ofstream (станд :: basic_string)
Я не уверен, что это имеет какое-то значение, но я просто опубликую весь мой код, это не так много до сих пор. Я постараюсь, чтобы он стал чище с этого момента.
#include <iostream>
#include <windows.h>
#include <direct.h>
#include <fstream>
using namespace std;
int main()
{ /*Introduction*/
SetConsoleTitle("Journal");
string action, prom0, filename, filepath;
filepath = "C:\\Users\\-\\Desktop\\Projects\\Journal Project\\Logs\\";
cout << "Hi and welcome to Journal! \nHere you can write down your day.\nWrite help for";
cout << "more \nType command to start: ";
/*Choose Action*/
cin >> action;
if (action == "new")
{system("cls");
/*Make new Journal file*/
cout << "Filename: ";
getline(cin, filename);
mkdir("C:\\Users\\-\\Desktop\\Projects\\Journal Project\\Logs");
ofstream journallogs(filepath + filename);
journallogs.close();
}
else {
cout << "Wrong command\n";
};
return 0;}
Есть две вещи неправильно. Во-первых, компилятор жалуется:
ofstream journallogs("C:\\Users\\-\\Desktop\\Projects\\Journal Project\\Logs\\" + getline(cin, filename), ios::out);
std::getline(istream&, string&)
возвращает istream&
, и вы не можете добавить char *
в istream
. Я рекомендую взглянуть на документацию для getline()
, которая может помочь вам лучше понять, как вы должны ее использовать. Вот пример:
string filepath = "C:\\Users\\-\\Desktop\\Projects\\Journal Project\\Logs\\";
string filename;
getline(cin, filename);
ofstream journallogs(filepath + filename);
Вторая проблема заключается в том, что вы читаете cin
в filename
перед вызовом getline()
. Когда вы вызываете getline()
, любое содержимое имени filename
отбрасывается, поэтому вы эффективно обрезаете первое слово с вашего имени файла, что, вероятно, не то, что вы хотите. Чтобы исправить это, удалите посторонние cin >> filename;
Примечание. Отступы важны и помогают вам читать собственный код. Постарайтесь, чтобы ваш код выглядел красиво.
Во-первых, узнайте следующее:
В остальном я не использую Windows, поэтому я не могу быть уверен, что мой код будет работать там, но подход будет.
Вы пытаетесь 1) получить имя файла от пользователя, 2) изменить его, а затем 3) использовать его для открытия файла; мы будем развивать эти три вещи в изоляции.
Получение имени файла у пользователя. Цивилизованные имена файлов не содержат пробелов, поэтому их можно читать с помощью cin
, но если вы хотите разрешить пробелы, вы можете использовать getline
вместо этого. В любом случае, протестируйте его.
Изменение имени файла. Напишите код, который присваивает значение имени файла, так же как это делает path--, не получает имя файла от пользователя, это замедляет ваше тестирование и не является надлежащей изоляцией. Теперь попробуйте добавить их. Если вы попробуете filepath + filename
, вы можете получить ошибку компилятора. Здесь, где вы должны понимать разницу между std::string
и char[]
. char[]
- это массив char
, и он (обычно) содержит последовательность символов с нулевым завершением; вы должны прочитать на массивах и указателях. Это примитивный тип, и вы не можете просто объединить два из них с "+", вы должны использовать что-то вроде strcat
, что опасно, если вы не сделали домашнее задание на массивах. С другой стороны, std::string
более сложна и может обрабатывать "+" и многие другие операции. Если у вас есть std::string x
и вы решили, что хотите получить char[]
, вы можете получить такой же: x.c_str()
.
Открытие файла. Если я правильно помню, конструктор ofstream
может принимать char[]
, но не std::string
. Проверьте это на жестко закодированную строку (изоляция!).
После того, как вы задействуете эти три компонента самостоятельно, вы можете подключить их вместе.
std::string
иchar[]
?