2

ofstreamを使用して出力を書き込むプログラムがあります。Visual Studioでコンパイルした場合、Windowsではすべてが完全に正常に機能しますが、GCCでコンパイルした場合、Linuxでは空のファイルのみが書き込まれます。

ofstream out(path_out_cstr, ofstream::out);
if(out.bad()){
 cout << "Could not write the file" << flush;
}
else{
 cout << "writing";

 out << "Content" << endl;

 if(out.fail()) cout << "writing failed";

 out.flush();
 out.close(); 
}

書き込まれているディレクトリには0777特権があります。

奇妙なことに、何も書かれていませんが、エラーは報告されていません。

gcc --versionは次のとおりです:(Gentoo 4.3.4 p1.0、pie-10.1.5)4.3.4

私はコードが機能する必要があることを知っているので、直接のコード修正よりも、何が間違っている可能性があるかという提案を探すようなものです。

編集:fwriteはまったく同じ方法で失敗するようです(何も書き込まれず、エラーは報告されません)。

編集:GCCとプログラムの両方を大学のディレクトリでSSH経由で実行しています(意味がある場合)。私はファイルを実行して書き込むのに十分な許可を持っています(ls。> out.txtは問題なく動作します)、問題があるのは私のプログラムだけです。

手伝ってくれてありがとう

4

4 に答える 4

7

私のために働く、ubuntug++-4.1。
実行して、ファイルに対する呼び出しがstrace ./testあるかどうかを確認しようとしましたか?write()

于 2010-05-24T09:39:32.107 に答える
2

最も可能性の高い解決策は、名前またはパスの問題が原因でファイルをコンストラクターで開くことができないことです。ファイルを開くことができない場合は、ビットではfailbitなくが設定されるため、次を使用するのではなく、それをテストします。badbitbad()

ofstream out(path_out_cstr, ofstream::out); 
if(out.fail()){ 
    cout << "Could not write the file" << flush; 
...

fail()failbitまたはbadbitのいずれかが設定されているかどうかをチェックしますが、badは単にbadbitをチェックします。ところで、私はあなたの例を試しましたが、問題はなかったので、意図的にパスを悪くしました-それでも問題はありませんが、それに変更するfail()と、悪いパスを拾いました。

于 2010-05-24T10:09:05.387 に答える
1

ファイルが作成されている場合、ファイルが書き込まれない理由がわかります。

の値を確認してくださいpath_out_cstr/Unixライクなシステムでは、パスはMS-DOSスタイルのバックスラッシュ''ではなくスラッシュ''で区切られ\ます。これは、2つのオペレーティングシステム間の動作の違いを説明している可能性があります。


更新しました

|に失敗しcatchたので しばらくの間問題が発生した場合は、例外処理アプローチを使用することをお勧めします...このサンプルは最初の失敗を報告した後に停止します...failbitbadbittry

#include <fstream>
#include <iostream>

int main(int argc, char* argv[])
{
    const char* const path_out = argv[1];

    std::cerr.exceptions(std::cerr.goodbit);

    std::ofstream the_file_stream;
    the_file_stream.exceptions(the_file_stream.badbit | the_file_stream.failbit);

    try
    {
        std::cerr << "Opening [" << path_out << "]" << std::endl;
        the_file_stream.open(path_out);

        std::cerr << "Writing" << std::endl;
        the_file_stream << "Content" << std::endl;

        std::cerr << "Flushing" << std::endl;
        the_file_stream.flush();

        std::cerr << "Closing" << std::endl;
        the_file_stream.close();
    }
    catch (const std::ofstream::failure& e)
    {
        std::cerr << "Failure: " << e.what() << std::endl;
    }

    return 0;
}
于 2010-05-24T09:49:47.810 に答える
0

g++4.4.1で動作します

于 2010-05-24T09:37:08.367 に答える