2011-10-25 5 views
0

グッドモーニング、グラム++はifstreamのための不完全なタイプ、正しいヘッダファイル存在

私はCを使用してファイルを読み込もうとしています++グラムを指定してコンパイル++(G ++(Ubuntuの4.4.3-4ubuntu5)4.4.3)。 TISがコンパイルされ、MSVC 2008の下で働く多く、ここでトリミング

を私のコードです:私が読んだ

#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"をホバーすると "Incomplete type ..."

私はプログラム(デバッグモード)を実行しても、エラーは発生せず、例外もスローされませんが、ファイルは開かれず、.is_open()はfalseです。

アイデア?

ウェス

+0

名前に "〜"を使用できないと思われます。 AFAIKでは、 "〜"文字はコマンドラインでシェルによってのみ展開されます。 – wilx

+0

おっと、私はそれを間違って入力しました。それは本当にスラッシュでした。 そして、はい、〜は私の本当の問題でした。存在しないファイルが不完全な型であることは明らかになりませんでした。とても興味深い。 ありがとう、ウェス –

答えて

1

~\S私に容疑者を探します。 @wilxが指摘しているように、これはシェルだけで意味があり、ファイルI/Oメソッドでは意味がありません。ユーザーの$HOME環境変数にフルパスをビルドします。

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

Linuxシステム上の~\Serial.Numberという名前のファイルが非常におそらくありません。それはあなたが望むもの(ホームディレクトリの下にSerial.Numberという名前のファイル)を意味するものではありません。

は、Linux上のファイルのパス ~\Serial.NumberopenシステムコールやC++のファイルストリームに渡されたとき、(でも原則的に可能な場合)にはほとんどありませんバックスラッシュ \続くチルダ ~で始まるファイル名を意味します存在する。

getenv("HOME")を使用してホームディレクトリを取得し、それを"/Serial.Number"文字列(バックスラッシュではない通常のスラッシュで始まる)に連結したいとします。

よろしくお願いいたします。

1

いくつかの問題があります:グラム++が正常にコードをコンパイルしている場合

  • が、(当然)でも何らかの理由でEclipseのC++パーサができない場合は、必要な種類を解決することができます。タイプを適切に解決するためにEclipseを取得することは、別の質問です。
  • ~をあなたのファイル名に使用すると、おそらくあなたの期待することはできません。 UNIXまたはLinuxシェルからの使用は、シェルがホームディレクトリに展開するためホームディレクトリを参照しますが、アプリケーションコードからの使用はリテラル~ディレクトリを参照します。
  • バックスラッシュは、CおよびC++のエスケープ文字です。だから\Sは特殊文字です(ちょうど\nが改行です)。特に\SはCおよびC++エスケープ文字の1つではないので、私はあなたのコンパイラが不平を言っていないことに驚いています。代わりに、Windowsの場合はバックスラッシュ("~\\Serial.number")をエスケープするか、Linuxの場合はスラッシュ("~/Serial.number")を使用するか(Windowsでも動作します)、クロスプラットフォームライブラリ(Boost.Filesystemなど)を使用してパスの違いに注意してくださいあなたのために。
関連する問題