Как назвать текстовый файл в определенном каталоге?

0

Хорошо спасибо за ответ 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;}
  • 1
    Вы понимаете разницу между std::string и char[] ?
  • 0
    Нет, я не знаю точных различий между ними. Я был бы рад получить любые ваши советы!
Теги:

2 ответа

1

Есть две вещи неправильно. Во-первых, компилятор жалуется:

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;

Примечание. Отступы важны и помогают вам читать собственный код. Постарайтесь, чтобы ваш код выглядел красиво.

0

Во-первых, узнайте следующее:

  1. Начните с малого и простого.
  2. Добавьте сложность немного за раз.
  3. Испытайте на каждом шагу.
  4. разработать новую функциональность в изоляции.
  5. Никогда не добавляйте к коду, который не работает.

В остальном я не использую 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. Проверьте это на жестко закодированную строку (изоляция!).

После того, как вы задействуете эти три компонента самостоятельно, вы можете подключить их вместе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню