2015-04-27 78 views
-2

作爲C++的新手,我查看了C++ concatenate string and int,但我的要求並不完全相同。在cpp中連接字符串和int作爲文件名

我有一個樣本代碼,如下:

#include <iostream> 
#include <fstream> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
std::string name = "John"; int age = 21; 
std::string result; 
std::ofstream myfile; 
char numstr[21]; 
sprintf(numstr, "%d", age); 
result = name + numstr; 
myfile.open(result); 
myfile << "HELLO THERE"; 
myfile.close(); 
return 0; 
} 

字符串和INT級聯一般的作品,但不是我希望它是一個文件名。

所以基本上,我想要的文件名是字符串和整數的組合。這不是爲我工作,我得到的錯誤

的參數1沒有已知的轉換,從 '的std :: string {又名 的std :: basic_string的}' 到 '爲const char *'

我想在用於循環這樣的邏輯在那裏

for(i=0;i<100;i++) { 
if(i%20==0) { 
    result = name + i; 
    myfile.open(result); 
    myfile << "The value is:" << i; 
    myfile.close(); } 
} 

所以,基本上,每20次迭代,我需要這個「值」要在其中將有名字John20一個新的文件打印, John40等等。所以,對於100次迭代,我應該有5個f爾斯。

+0

也許試試更多類似C++的方式將int轉換爲字符串(std :: to_string) – Creris

+1

做一個_minimal_測試用例。如果你有困擾,你會知道這與連接沒有任何關係。你只是沒有將正確的參數傳遞給流構造函數。 –

回答

4

字符串和int連接一般工作,但不是當我希望它是一個文件名。

它與連接字符串無關。您的編譯器不支持C++ 11,這意味着您無法將std::string作爲參數傳遞給std::ofstream::open。您需要一個指向空終止字符串的指針。幸運的是,std::string::c_str()爲您提供了:

myfile.open(result.c_str()); 

注意,您可以直接實例流:

myfile(result.c_str()); // opens file 

至於環路版本,請參閱串聯整數和字符串處理的衆多副本中的一個。

3

您引用的問題與您的字符串連接問題高度相關。我建議使用C++11 solution如果可能的話:

#include <fstream> 
#include <sstream> 

int main() { 
    const std::string name = "John"; 
    std::ofstream myfile; 
    for (int i = 0; i < 100; i += 20) { 
     myfile.open(name + std::to_string(i)); 
     myfile << "The value is:" << i; 
     myfile.close(); 
    } 
} 

還是stringstream solution兼容性:

#include <fstream> 
#include <sstream> 

int main() { 
    const std::string name = "John"; 
    std::ofstream myfile; 
    for (int i = 0; i < 100; i += 20) { 
     std::stringstream ss; 
     ss << name << i; 
     myfile.open(ss.str().c_str()); 
     myfile << "The value is:" << i; 
     myfile.close(); 
    } 
} 

此外,你應該:

  • 消除雜散包括<iostream><stdio.h>
  • 消除using namespace std;,這是一般不好的做法 - 你甚至不需要它。
  • 簡化環路
  • 標記前綴const

(您可以組合使用sprintf(numstr, "%s%d", name.c_str(), i)文件名,但這僅僅是非常差的C++代碼。)

+0

第一次聽說'std :: to_string'! – coyotte508

0

如果我們第一次啓動通過查看循環,我們可以選擇從1開始而不是從0開始計數,這樣您的第一個文件將是name+20,並且我們在i命中101之前停止計數,這樣您的最後一個文件將是name+100

我們還需要將.txt添加到字符串中,以便創建文本文件。
如果您不會更改數據(例如名稱),則可以將這些參數作爲參考或引用傳遞給函數。然後,我們需要將i轉換爲字符串,如果您的編譯器支持C++ 11,則可以使用std::to_string()。我選擇創建一個ostringstream對象,並存儲從成員函數.str()返回的字符串。

這是你的循環編輯:

for(int i=1;i != 101;++i) { 
     if(i%20==0) { 
      ostringstream temp;   // use a string stream to convert int... 
      temp << i; 
      str = temp.str();    // ...to str 
      result = name + str + ending; // concatenating strings. 
      myfile.open(result); 
      myfile << "The value is:" << i; 
      myfile.close(); 
     } 
} 

現在是將函數的在這個循環中,所有相關的參數傳遞給它一個好主意。這是一個完整的工作demo

輸出文件:John20.txt,John40.txt,John60.txt,John80.txt,John100.txt
還有其他的方法來做到這一點,但是這應該給你一個大概的概念。希望能幫助到你。