以下是输出文件的代码。如果我想每次给这个输出文件不同的名称,例如,如用户所要求的那样,该怎么办?什么样的getline命令会有所帮助。 我知道我可以简单地使用字符串名称my_file,但所需的名称不在字符串名称中。
void save(cdStruct *ptr) //Function that saves database info to file
{
ofstream dataFile;
dataFile.open("output.txt", ios::out | ios::app);
dataFile << ptr->title << endl;
dataFile << ptr->artist << endl;
dataFile << ptr->numberOfSongs << endl;
dataFile << ptr->number << endl;
dataFile.close();
}
答案 0 :(得分:1)
您想要更改此行:
dataFile.open(“output.txt”,ios :: out | ios :: app);
这样的事情?
dataFile.open(my_name_string,ios :: out | ios :: app);
如果是,您只需要阅读此字符串,添加“.txt”就可以了。
检查此代码:
字符串名称;
cin&gt; name;
name.append(名为 “txt”);
ofstream dataFile;
dataFile.open(name.c_str(),ios :: out | ios :: app);
dataFile.close();
答案 1 :(得分:0)
您的具体问题不是“根据用户需要提供输出文件所需名称”,但“如何在命令行程序中读取用户输入”。为此,您可以使用std::getline
:
#include <iostream>
#include <string>
int main() {
std::string filename;
getline(std::cin, filename);
}
可能很想使用operator<<
重载
#include <iostream>
#include <string>
int main () {
std::string filename;
std::cin >> filename;
}
但是,如果您的文件名包含空格字符,它们会给出错误的结果。
旁注:当您要强制执行非空值时,请不要传递可空指针:
// don't: void save(cdStruct *ptr)
void save(cdStruct const &ptr) // <- ah, better
答案 2 :(得分:0)
根据您对其他答案的评论,您可能会将文件名称作为std::string
传递给std::ofstream::open
。在C++11
之前,它只接受了const char *
参数,而不是std::string
(请参阅this reference)。
要解决此问题,请使用filename.c_str()
作为第一个参数,而不是filename
。这将返回以null结尾的char数组,即std::ofstream::open
答案 3 :(得分:0)
您的错误消息告诉您:当您使用std::string
时,您正在使用char const *
。现在我们只需要找到错误发生的适当位置。
快速浏览std::getline
的在线文档告诉我们,此功能不是问题:签名允许std::string
。唯一的变化是std::ofstream(filename, std::ios::out | std::ios::ate)
,所以我们检查std::ofstream
的文档;确实是char const *
。
这个问题应该通过替换
来快速解决std::ofstream dataFile(filename, std::ios::out | std::ios::ate);
与
std::ofstream dataFile(filename.data(), std::ios::out | std::ios::ate);
然后它应该编译。
尝试理解编译器提供给您的错误消息并搜索可能存在问题的引用,这一点非常重要。