2013-06-02 18 views
12

私は、Cプログラムからstdoutにバイナリデータを書き込む最良の方法を見つけようとしています。それはLinux上で正常に動作しますが、 "\ n"は "\ r \ n"に変換されるため、Windowsでコンパイルすると問題が発生します。バイナリモードでstdoutに書き込む最も簡単な方法は何ですか?

改行の変換を避けるバイナリモードでstdoutに書き込む標準的な方法はありますか?そうでない場合、Windowsにこれをやめるようにする最も簡単な方法は何ですか?

私はGCCとMinGWを使用しています。

+0

現在どのようなものを出力していますか? –

+1

'printf'の代わりに' fwrite'を使ってみましたか? – tay10r

+0

私は現在fwriteを使用しています。 – jncraton

答えて

18

あなたは、Linuxとの互換性を維持したい場合はIFDEFで包みsetmode(fileno(stdout), O_BINARY)

を使用することができます。

は、あなたが(クロスプラットフォームの一種である)そのような何かを行うことができますもhttp://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.80).aspx

+0

それはうまくいくようです。ありがとう!少なくとも私の環境では、setmodeに2番目のパラメータが必要でした。私は答えを更新しました。 – jncraton

+3

'freopen(NULL、" wb "、stdout)'も使用でき、移植性の高いCです。しかし、望ましくない切り捨て効果があるかもしれません。 http://pubs.opengroup.org/onlinepubs/9699919799/functions/freopen.htmlの「アプリケーションの使用法」のセクションを参照してください。それが価値あるものについては、私はこのテキストが間違っていると思う。新しいファイル名がNULLの場合、基本的な 'open'操作は存在しないので、' O_TRUNC'に関するテキストは適用されません。 –

+0

@R .. Windowsで 'NULL'ファイル名で' freopen'を使うことはできません。これは、次のように無効なパラメータハンドラを呼び出します:http://msdn.microsoft.com/en-us/library/wk2h68td.aspx無効なパラメータハンドラのデフォルトの動作は、アプリケーションをクラッシュさせることです。 – Vargas

5

参照してください:

FILE *const in = fdopen(dup(fileno(stdin)), "rb"); 
FILE *const out = fdopen(dup(fileno(stdout)), "wb"); 
/* ... */ 
fclose(in); 
fclose(out); 

それとも、write()使用することができますし、read()システムがfileno(stdin)fileno(stdout)を直接呼び出します。これらのシステムコールは、より低いレベルで動作し、変換を行いません。しかし、彼らはまたFILEストリームから得るバッファリングを持っていません。

+0

'write()'の部分が間違っているようですが、私はまだそれを使って改行を取得しています –

+0

'man -s 2 write'というシステムコール' write() 'を使用していない可能性があります。そのレベルにテキスト/バイナリモードはありません。 –

関連する問題