2011-10-25 32 views
0

早安,克++不完全類型ifstream的,正確的頭文件呈現

我試圖使用C++使用g ++編譯(克++(Ubuntu的4.4.3-4ubuntu5)4.4.3),以讀取文件。提斯編譯和2008 MSVC下工作

這裏大部分修剪是我的代碼:

#include <iostream> 
    #include <fstream> 

    int main(int argc, char* argv[]) 
    { 
     const char filename[] ("~/Serial.Number") 

     std::ifstream   afile  (fileName); 
     if (afile.is_open()) 
     { 
      // read input 
      afile.close(); 
     } 
    } 

一切我讀過說,這是足以使輸入文件的工作。當我編寫它(重複嘗試)時,Eclipse的光標在「編譯器」上說'afile'是一個ifstream,但是當我編譯它時,它又一次在「afile」上徘徊,我得到「不完整類型...」。

更奇怪的是,當我運行程序(調試模式)它運行,沒有錯誤,沒有拋出異常,但文件從不打開,.is_open()爲false。

任何想法?

韋斯

+0

我懷疑你不能在名稱中使用「〜」。 AFAIK,「〜」字符只在命令行上通過shell擴展。 – wilx

+0

糟糕,我打錯了。這真的是一個正斜槓。 而且,是的,〜是我真正的問題。從來不知道一個不存在的文件會將自己展現爲不完整的類型。很有意思。 謝謝,Wes –

回答

1

~\S看起來可疑我。正如@wilx指出的那樣,這隻對shell有意義,而不對文件I/O方法有意義。構建FULLPATH與用戶的$HOME環境變量:

std::string fullpath = getenv("HOME"); 
fullpath += "/Serial.Number"; 
... 
3

那裏很可能沒有你的Linux系統上的一個名爲~\Serial.Number文件。這並不意味着你可能想要的東西(在你的主目錄下名爲Serial.Number的文件)。

Linux上的文件路徑~\Serial.Number,當傳遞給open系統調用或C++文件流,將意味着一個文件名開始後面是一個反斜槓\這是非常不可能的(即使可能在原則上),以波浪線~存在。

您可能想要使用getenv("HOME")檢索主目錄並將其鏈接到"/Serial.Number"字符串(以普通斜槓而不是反斜槓開始)。

問候。

1

有幾個問題:

  • 如果G ++成功編譯代碼,那麼它(顯然)能夠解決必要的類型,即使Eclipse的C++解析器無論出於何種原因不能。讓Eclipse正確解析類型是一個單獨的問題。
  • 在文件名中使用~可能不會達到您的預期效果。在Unix或Linux shell中使用它指的是您的主目錄,因爲shell會將其擴展到您的主目錄,但在應用程序代碼中使用它指的是文字~目錄。
  • 反斜槓是C和C++轉義字符。所以\S是一個特殊字符(就像\n是一個換行符)。由於\S尤其不是C和C++轉義字符之一,所以我很驚訝你的編譯器不抱怨。您應該改爲避免使用Windows的反斜槓(即"~\\Serial.number"),或使用Linux的正斜槓("~/Serial.number")(也可以在Windows中使用)或使用跨平臺的庫(如Boost.Filesystem),這將處理路徑差異爲你。