用户通过cin命名输出文件

时间:2012-11-21 16:02:19

标签: c++

以下是输出文件的代码。如果我想每次给这个输出文件不同的名称,例如,如用户所要求的那样,该怎么办?什么样的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 个答案:

答案 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);

然后它应该编译。

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