2012-09-17 70 views
2

好像ifstream*->open如我所料不工作... 下面是代碼:(編譯與MAC OSX 10.7使用-std=c++11g++ 4.7C++ ifstream的指針打開的文件失敗

#include <string> 
#include <iostream> 
#include <fstream> 
#include <vector> 
using namespace std; 
int main(int argc, char** argv) 
{ 
    string line; 
    vector<string> fname = {"a.txt","b.txt"}; 
    vector<ifstream*> files (2, new ifstream); 

    files[0]->open(fname[0]); 
    getline(*files[0], line, '\n'); 
    cerr<<"a.txt: "<<line<<endl; 
    //this one prints the first line of a.txt 

    line.clear(); 

    files[1]->open(fname[1]); 
    getline(*files[1], line, '\n'); 

    cerr<<"b.txt: "<<line<<endl; 
    //but this one fails to print any from b.txt 
    //actually, b.txt is not opened! 

    return 0; 
} 

任何一個可以告訴我這裏有什麼錯?

+5

你意識到這些文件都沒有被正確關閉,因爲你正在存儲指向動態分配的流的指針,而不是在它們上調用'delete',對吧? –

+0

你的意思是'ifstream-> open'而不是'ifstream * - > open'這意味着'ifstream'的兩個去引用指針(暗示)?問,而不是編輯得到答案。 –

回答

5

執行new std::ifstream一次使用的位置,而不是您要求的每個2的值。

new std::ifstream創建一個ifstream指針,其指針值在files中由std::ifstream構造函數插入兩次。

std::vector只需要包含的對象,在這種情況下是ifstream*指針的照顧。所以,2複製指針值。當files超出範圍時,指針(和向量中的支持數據)將被處理,但不會指向指針指向的值。因此,矢量不會刪除您的新對象(放置在向量中兩次)。

operator delete不會被調用,因爲指針可以有很多用法,不能輕易確定。其中之一是將兩個相同的指針放在向量中

+0

我的天哪,就是這樣!非常感謝!! – user1678249