2013-11-01 89 views
-1

我在寫一個類來提供將用於讀取和寫入文件的各種IO操作。我目前正試圖從fstream繼承,而不是創建自己的文件打開,關閉等功能。目前我下面的示例代碼沒有添加任何函數,我只是打開寫入並關閉它。但是,測試代碼無法成功打開文件時,exicuted。我將添加額外的代碼,我可以正確地從fstream繼承。這段代碼使用g ++時沒有編譯器警告或錯誤,它運行時沒有崩潰,但是我收到「無法打開文件」消息,證明open並不成功。從fstream繼承

int main(int argc, char* argv[]) 
{ 
    FileParser myFileParser; 

    myFileParser.open("c:\test.txt"); 
    if (myFileParser.is_open()) 
    { 
    myFileParser << "This is a line.\n"; 
    myFileParser << "This is another line.\n"; 
    myFileParser.close(); 
    } 
    else 
    { 
    cout << "Unable to open file\r\n"; 
    } 

    myFileParser.close(); 

    return 0; 
} 

#pragma once 
#include <fstream> 
using namespace std; 

class FileParser: public fstream 
{ 
    public: 
     FileParser(void); 
     virtual ~FileParser(void); 

    private: 
}; 

#include "FileParser.h" 

FileParser::FileParser(void) 
{ 
} 

FileParser::~FileParser(void) 
{ 
} 

任何有關這個問題的幫助將不勝感激。


此問題現已解決,感謝您的支持。

問候

+0

除了@WhozCraig所說的,你已經選擇擴展可能是最糟糕的一類設計。關於如何實際執行的文檔不存在。我在幾年前嘗試過提供套接字流類。它甚至花了很長時間才弄清楚該怎麼做,以及實際的I/O發生在哪裏。相比之下,編寫套接字部分是微不足道的。 – EJP

回答

1

爲了解決您的燃眉之急:

  1. 你忘了轉義反斜線:

    myFileParser.open("c:\\test.txt");

  2. 從文件路徑,即時猜測你是在Windows ,你可能會得到「權限被拒絕」,因爲你沒有權限在該位置打開文件(這是真正的Vista和以上)。

+0

謝謝,問題是windows的權限問題,我曾想過寫給C:\會避免這個問題,但我錯了。我已將代碼更改爲'myFileParser.open(「test.txt」); ',並且文件由其中沒有文本生成。我使用標準的fstream文件進行了相同的測試,並且工作正常。這將支持另外兩個意見。 – rutri

+0

@rutri:你需要以追加模式打開:'myFileParser.open(「test.txt」,std :: ios :: app);' –

+0

我已經抓住了那個,我實際上打開它爲'myFileParser.open (「test.txt」,ios :: out | ios :: app);'並且它沒有任何作用,我也刪除了它看到的文件,裏面沒有任何東西被重新創建。 – rutri