-4

以下是具有输出文件的代码。如果我想每次都给这个输出文件不同的名称,即,按照用户的要求。什么样的 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();

        }
4

4 回答 4

1

你想改变这一行:

dataFile.open("output.txt", ios::out | ios::app);

到这样的事情??

dataFile.open(my_name_string, ios::out | ios::app);

如果是,您只需在之前阅读此字符串,添加“.txt”即可。

检查此代码:

字符串名称;
cin >名称;

name.append(".txt");

流数据文件;
dataFile.open(name.c_str(), ios::out | ios::app);
数据文件.close();

于 2012-11-21T16:06:15.523 回答
0

从您对其他答案的评论看来,您将文件名作为std::stringto 传递std::ofstream::open。之前C++11它只接受一个const char *参数,而不是一个std::string(参见这个参考)。

要将此filename.c_str()用作第一个参数而不是filename. 这将返回一个以 null 结尾的 char 数组,该类型由std::ofstream::open

于 2012-11-21T16:52:05.817 回答
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);

然后它应该编译。

尝试理解编译器提供给您的错误消息并搜索可能存在问题的参考,这一点非常重要。

于 2012-11-21T16:52:30.967 回答
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
于 2012-11-21T16:06:26.330 回答