2013-08-28 20 views
1

我一直在一個問題上停留了一段時間,似乎無法找到答案。 我試圖創建具有相同的名稱,但在每次結束時不同數量的多個文件,我起初只是用製作文件的順序列表

int seq_number = 1; 
while (seq_number < 10) 
{ 
ofstream fsave; 
fsave.open("filename" + seq_number + ".txt"); 
fsave << "blablabla"; 
fsave.close(); 
seq_number = seq_number + 1; 
} 

嘗試這不過是給了我一個很奇怪的結果,其中字母混亂起來,我不知道這是如何工作,但我知道它不。

我在網上看了一下,發現字符串流或sstream,並與嘗試,但它不斷給我的錯誤太多,

string filename; 
filename = "character"; 
ostringstream s; 
s << filename << seq_number; 
filename(s.str()); 
fsave.open(filename + ".txt"); 
fsave << "blabla" 
fsave.close(;) 

,但我不斷收到一個錯誤:

敵不過通話以`(的std :: string)(STD :: basic_string的,性病::分配器>)」

我不知道字符串流是怎麼工作的這樣的IM工作過的本能,但我將不勝感激任何方式,這是可能的,說實話,我認爲我寧願沒有浪費,但我需要一個獲得一個int和str在一起並保存一個字符串的文件名的方法。 ,除非你知道一個更好的辦法;)謝謝你們

+1

'文件名(X)'語法只能構建字符串時使用。之後你使用'='語法。如果你改變了,你的代碼應該可以工作。 –

回答

0

更換

fsave.open(filename + ".txt"); 

隨着

fsave.open((filename + ".txt").c_str()); 

這是因爲ofstream構造函數接受作爲參數char const *,不是std::string

此外,您的第一個版本會生成奇怪的文件名,因爲在C和C++中,向char *添加一個整數只是在字符數組內偏移。它不附加到字符串。

0

你可以這樣說:

ostringstream s; 
s << "character" << seq_number << ".txt"; 
fsave.open(s.str()); 
fsave << "blabla"; 
fsave.close(); 

這是你如何能實現原來的循環:

for (int seq_number = 1; seq_number<10; ++seq_number) 
{ 
    ostringstream s; 
    s << "filename" << seq_number << ".txt"; 
    ofstream fsave(s.str()); 
    fsave << "blablabla"; 
} 
+0

請注意,這需要標準庫實現中的C++ 11支持。如果它抱怨,使用'fsave.open(s.str()。c_str());'。 – BoBTFish

+0

@BoBTFish:好點 –

+0

有一天,我們將能夠停止添加這些類型的限定符。一天。不久?也許。 – BoBTFish

2
filename(s.str()); 

這是錯誤的;你沒有構造一個新的變量(filename已經構建),你想在這裏是一個任務。

filename = s.str(); 

然後,

fsave.open((filename + ".txt").c_str()); 

(不過,如果你使用的是C++ 11,這種變化是不是必要的)

不過,我個人只想構建與整個文件名流:

ostringstream s; 
s<<"character"<<seq_number<<".txt"; 
fsave.open(s.str.c_str()); 

I'm not sure how string stream works exactly so im working off of instinct

這是一個非常糟糕的主意,C++通常是一個奇怪的語法,segfaults和未定義的行爲,通過直覺去通常會導致災難。


關於錯誤你:

fsave.open("filename" + seq_number + ".txt"); 

這甚至不應該編譯,因爲你正在總結整數到const char *(因此移動「的字符串開始」),然後將其再次總結爲const char *,這是完全不允許的。也許它可以編譯,如果它是這樣的:

fsave.open("filename" + seq_number); 

,但它不會給所需要的結果 - "filename"是一個指針(不是C++字符串),所以相加的整數它只是移動的指針給定抵消。

在你的第二個片段中,相反,你使用的是一個對象(filename),因爲它是一個函數,只有當類重載operator();因此,編譯器會抱怨這樣的操作在該對象上是不允許的。

+0

謝謝你的一個驚人的解釋,是的,我知道在編碼測試是一個壞主意,我只是盡我所能,直到我不知道,現在這是我要求幫助;) –

0

在C++中,你不能轉換的int爲一個字符串,或連接它一個 - 而不是一個'char *`:

"filename" + seq_number + ".txt" 
^const char* ^int  ^const char* 

此外,ostream不能收到文件名作爲string,它必須是一個const char*,你可以通過`c_str()`臨時獲取它。

使用sprintfostringstream(像你一樣),或者C++ 11 to_string做到這一點:

#include <string> 
#include <iostream> 
int main() { 
    for(int seq_number = 1; i<10; ++i) { 
     std::string num_as_string = std::to_string(seq_number); // make a string, C++11 
     std::string filename = "abcd" + num_as_string + ".txt"; 
     std::ostream f(filename.c_str()); 
     f << "text\n"; 
    } 
} 

這(模錯別字)應該讓你開始。

0

你可以做這樣的事情:

#include <iostream> 
#include <string> 
#include <sstream> 

int main (int argc, char const* argv[]) 
{ 
    std::string filename; 
    int seq_number = 10; 
    filename = "character"; 
    std::stringstream s; 
    s << filename << seq_number << ".txt"; 
    filename = s.str(); 
    std::cout<< filename << std::endl; // <-- Here open your file instead print the filename 
}