2012-02-04 75 views
6

我需要同時寫入一堆文件,所以我決定使用map <string, ofstream>在C++中處理文件的地圖

map<string, ofstream> MyFileMap; 

我採取vector<string> FileInd,其中包括,說"a" "b" "c",並嘗試打開我的文件:

for (vector<string>::iterator it = FileInd.begin(); iter != FileInd.end(); ++it){ 
    ... 
    MyFileMap[*it].open("/myhomefolder/"+(*it)+"."); 
} 

我得到的錯誤

request for member 'open' in ..... , which is of non-class type 'std::ofstream*' 

我試着切換到

map<string, ofstream*> MyFileMap; 

但它也沒有工作。

任何人都可以幫忙嗎?

謝謝。

澄清:

我都試過

map<string, ofstream> MyFileMap; map<string, ofstream*> MyFileMap;

.open ->open

4種變體都不起作用。

解決方案(以下Rob的代碼提示):

基本上,我忘了 「新」,以下爲我的作品:

map<string, ofstream*> MyFileMap; 
MyFileMap[*it] = new ofstream("/myhomefolder/"+(*it)+"."); 
+0

你想' - > open' ,而不是'.open'。 vector上的'operator []'返回的東西像一個指針,而不是一個引用。 – 2012-02-04 05:59:00

+0

@DavidSchwartz不按照http://www.cplusplus.com/reference/stl/map/operator%5B%5D/ – Borealid 2012-02-04 06:10:12

+0

對不起,我的意思是一個'map',而不是'vector'。 – 2012-02-04 06:18:11

回答

8

std::map<std::string, std::ofstream>不可能工作,因爲std::map要求其數據類型爲Assignable,其中std::ofstream不是。或者,數據類型必須是指向ofstream的指針 - 原始指針或智能指針。

這裏是我會怎麼做,用C++ 11周的特點:在C++ 03

#include <string> 
#include <map> 
#include <fstream> 
#include <iostream> 
#include <vector> 

int main (int ac, char **av) 
{ 
    // Convenient access to argument array 
    std::vector<std::string> fileNames(av+1, av+ac); 

    // If I were smart, this would be std::shared_ptr or something 
    std::map<std::string, std::ofstream*> fileMap; 

    // Open all of the files 
    for(auto& fileName : fileNames) { 
    fileMap[fileName] = new std::ofstream("/tmp/xxx/"+fileName+".txt"); 
    if(!fileMap[fileName] || !*fileMap[fileName]) 
     perror(fileName.c_str()); 
    } 

    // Write some data to all of the files 
    for(auto& pair : fileMap) { 
    *pair.second << "Hello, world\n"; 
    } 

    // Close all of the files 
    // If I had used std::shared_ptr, I could skip this step 
    for(auto& pair : fileMap) { 
    delete pair.second; 
    pair.second = 0; 
    } 
} 

和第二詩句,:

#include <string> 
#include <map> 
#include <fstream> 
#include <iostream> 
#include <vector> 

int main (int ac, char **av) 
{ 
    typedef std::map<std::string, std::ofstream*> Map; 
    typedef Map::iterator Iterator; 

    Map fileMap; 

    // Open all of the files 
    std::string xxx("/tmp/xxx/"); 
    while(av++,--ac) { 
    fileMap[*av] = new std::ofstream((xxx+*av+".txt").c_str()); 
    if(!fileMap[*av] || !*fileMap[*av]) 
     perror(*av); 
    } 

    // Write some data to all of the files 
    for(Iterator it = fileMap.begin(); it != fileMap.end(); ++it) { 
    *(it->second) << "Hello, world\n"; 
    } 

    // Close all of the files 
    for(Iterator it = fileMap.begin(); it != fileMap.end(); ++it) { 
    delete it->second; 
    it->second = 0; 
    } 
} 
+0

感謝您的及時答覆和一個整潔的例子。我忘了「新」。 – LazyCat 2012-02-04 06:36:07

+0

作爲cppcoreguidelines建議不建議原始指針作爲最佳做法。有沒有其他方法? – 2016-01-05 22:11:24