2012-11-21 65 views
-4

以下是輸出文件的代碼。如果我想每次給這個輸出文件起個不同的名字,即按照用戶的要求。什麼樣的getline命令會有所幫助。 我知道我可以簡單地cin一個字符串名稱my_file但所需的名稱是在輸入不在字符串名稱中。以用戶輸入cin命名輸出文件

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

到目前爲止您嘗試了什麼? – emartel

+0

你必須比這更具體。 – Default

+0

@Default我的意思是每次程序運行時,都應該詢問用戶文件的名稱。那麼這個文件應該用這個名字保存。 – Terrenium

回答

1

你想改變這一行:

dataFile.open( 「output.txt的」 IOS ::出來| IOS ::應用);

要這樣?

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

如果是,你只需要先閱讀這個字符串,添加「.txt」,它就是一切。

檢查這個代碼:

字符串名稱;
cin> name;

name.append(「。txt」);

ofstream dataFile;
dataFile.open(name.c_str(),ios :: out | ios :: app);
dataFile.close();

+0

它不起作用 – Terrenium

+0

My_file name是一個字符串。現在輸入這個輸入。 所需的名稱在輸入中不在字符串名稱中。 – Terrenium

+0

你可以去掉那個糟糕的'new'和'strcpy'代碼,只需要'dataFile.open(name.c_str(),ios :: app)'。 – Blastfurnace

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 
+0

你的意思是這樣的: getline(cin,file_name); – Terrenium

+0

data.file(file_name,ios :: out | ios :: app) – Terrenium

+0

@AzkaAhmad:這正是我寫的。你想向我解釋什麼? –

0

從其他的答案您的意見聽起來像你傳遞文件名作爲std::string:當您要執行非空值不爲空的傳遞指針到std::ofstream::open。在C++11之前它只接受const char *參數,而不是std::string(參見this reference)。

要修復此使用filename.c_str()作爲第一個參數而不是filename。這將返回一個空終止字符數組,通過std::ofstream::open

+0

該死的你更快:) – nijansen

+0

@Blastfurnace非常感謝 – Terrenium

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

迅速解決,那麼它應該編譯。

嘗試瞭解編譯器向您提供的錯誤消息並搜索可能存在問題的引用是非常重要的。

+0

如果你想要一個以null結束的''''而不是'data()',你應該使用'c_str C'字符串。您引用的網站也過時了,「C++ 11」增加了一個'ofstream :: open'重載,它接受一個'std :: string'參數。 – Blastfurnace