好的,谢谢你的回答!我改变了我的代码,但现在它抱怨:
没有用于调用
的匹配函数的std :: 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;}
答案 0 :(得分:1)
有两件事是错的。第一个是编译器抱怨的内容:
ofstream journallogs("C:\\Users\\-\\Desktop\\Projects\\Journal Project\\Logs\\" + getline(cin, filename), ios::out);
std::getline(istream&, string&)
会返回istream&
,您无法将char *
添加到istream
。我建议您查看documentation for 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;
注意:缩进很重要,可以帮助您阅读自己的代码。努力保持代码看起来不错。
答案 1 :(得分:0)
首先,了解这一点:
对于其他人,我不使用Windows,所以我无法确定我的代码是否可以在那里工作,但方法会有。
您正在尝试1)从用户获取文件名,2)修改它然后3)使用它来打开文件;我们将孤立地开发这三件事。
从用户那里获取文件名。文明文件名不包含空格,因此可以使用cin
读取它们,但如果要允许空格,则可以使用getline
。无论哪种方式,测试它。
修改文件名。编写为文件名赋值的代码,就像对路径一样 - 做不从用户那里获取文件名,它会减慢你的测试速度并且不正确隔离。现在尝试追加它们。如果您尝试filepath + filename
,则可能会收到编译错误。您必须在这里了解std::string
和char[]
之间的区别。 char[]
是char
的数组,它(通常)包含以空值终止的字符序列;你必须阅读数组和指针。它是一种原始类型,你不能简单地用“+”连接它们中的两个,你必须使用类似strcat
的东西,如果你没有在数组上完成你的作业,这是很危险的。另一方面,std::string
更复杂,可以处理'+'和许多其他操作。如果你有一个std::string x
而你决定想要一个char[]
,那么你可以这样做:x.c_str()
。
打开文件。如果我没记错,ofstream
构造函数可以char[]
,但不 std::string
。使用硬编码字符串进行测试(隔离!)。
一旦您将这三个组件独立工作,您就可以将它们连接在一起。