2016-12-03 7 views
0

この単純なプログラムは、ifstreamを使用してデータを読み取ることができません。読み取りは常に空文字列です。STDファイルストリームが壊れていますか? (内部ファイルバッファヌル、入力を読み取ることができません)

#include <fstream> 
#include <string> 
#include <iostream> 

std::string getFileString(const std::string& path) 
{ 
    std::ifstream file(path); 
    if (!file) 
     throw std::exception("Cannot Open File"); 
    if (!file.is_open() && !file.good()) 
     throw std::exception("Cannot Open File"); 
    std::string t; 
    file >> t; 
    std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); 

    return content; 
} 

int main() 
{ 
    std::string t = getFileString("C:\\Users\\user\\Documents\\folder\\t1.txt"); 
    return 0; 
} 

私はこれを数時間デバッグしようとしましたが、修正する方法はありません。私はこの全く同じことをするために新しいプロジェクトを試しました。ifstreamは何も読みません。

私が確認した:

  • ファイルにデータがある

    • パスは、私はデバッグ・ライブラリ

    で、デバッグの下でコンパイルしています正しい

  • です私は試しました:

    • のstd :: getlineの(ファイル、T)

    • file.getline

    • 使用してイテレータ

    んが、例外はありません>>演算子を使用して

  • スローされる(ios :: failbitとios :: badbitが設定されていても)

    ファイルは

    file.is_openは、()()壊れているように見える

    私は(コンストラクタ呼び出し後)デバッガでファイルストリームオブジェクトを調べる

    trueで真とfile.goodである(全体の良いですバッファがヌルで、ポインタにヌルの束があり、唯一の有効なデータはファイル自体への参照です)。

    ifstream in debug

    私はWin32とx64の両方のためにコンパイルしていると私は同じ結果を得ます。

    VS 2012用の配布可能なC++のインストールを修復しました。これは同じ問題です。

    私はこの時点で何をすべきか分かりません。私はこれまでにこのような問題は見たことがありません。私は他のstdオブジェクトもこのように壊れているのか疑問に思っています。あるいは、何らかの形で壊れているCファイルストリームです。

    編集***私は引数を削除しましたが、読み込まれているデータは私のファイルからのものではありません。

    enter image description here

  • +0

    ランダムな引数を 'ifstream'コンストラクタに渡すのはなぜですか?それらはどこから手に入りましたか? [マニュアル](http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream)では、それらについて説明していますか? –

    +0

    あなたはどんなランダムな議論をしていますか?私はパスと使用するフラグを渡しています。 – Igneous01

    +0

    @ Igneous01 'std :: ios :: failbit | std :: ios :: badbit'の引数です。 –

    答えて

    2
    std::ifstream file(path, std::ios::in | std::ios::failbit | std::ios::badbit); 
    

    あなたはすでにそれが構築されています直後に、失敗した状態にあるものとしてフラグが立てられていますファイルオブジェクトを作成しました。

    これがあなたの望むものでない場合は、failbitbadbitを削除してください。実際には、ifstreamのコンストラクタの2番目のパラメータがデフォルトでios::inにデフォルト設定されているため、そのパラメータ全体を完全に削除してください。

    +0

    私は元の投稿を更新しました - まだ喜びはありません。私は最初にフラグを付けずに試してみたことを忘れていました(例外をスローするので、コンストラクタにこれらを追加することを述べた記事を見ました)。 – Igneous01

    0

    サンプルプログラムをコンパイルできません。そして、saysexceptionは、char*引数では構築できません。代わりに、たとえばruntime_errorを使用します。

    私は、間違ったプログラムをテストすることをお勧めします。 IDEがソースコードをコンパイルできないかもしれませんが、何らかの理由でそれを見落とし、古いバージョンのバイナリコードをデバッグすることがあります。

    +0

    興味深い例外は、確かにメッセージの引数としてconst char *を取ることができます。どのコンパイラを使用していますか? – Igneous01

    +0

    リンクされたページは 'const char *'について同意しません。私のコンパイラはgcc 5.3.1とclang 3.8.0です。 – olpa

    +0

    これで、vC++にstd :: exceptionの引数としてconst char *を許可する拡張機能が追加されました。 https://msdn.microsoft.com/en-us/library/c4ts6d5a.aspx – Igneous01

    関連する問題