|
分類:[C/C++]
別スレッドの返答に書かれていたバイナリファイルを扱うプログラムで気になっ
たので整理も兼ねて調べてみたところ、標準入出力について、C言語ではできる
ものの、C++ではどうやってもできそうにないのですが、本質的に無理なので
しょうかね?
実際上、標準入出力をバイナリモードで使うかどうかは別としてライブリの使い
方としてどうなのかという疑問です。
実際のファイルであればios::binary指定でOKなのですが。
<試したファイル>
16進ダンプとして
20 41 42 43 0D 0D 0A 0A 20 20 1A 41 0D 0A
というファイル。
狙いはテキストファイルの処理で出てくる
・1Aの処理・・EOFと扱われるのをスキップできるか
・0Aの処理・・出力で0D/0Aに変換されるか
・0Dの処理・・入力で無視されるか
などを確認すること。
このファイルをhogeIn.binとして
hoge < hogeIn.bin > hogeOut.bin
を実行しい、hogeOut.bin が hogeIn.bin と同じになるかどうか。
<C言語の場合>
setmode() を使用することで制御できる
int main(void)
{
int c;
setmode(0, O_BINARY);
setmode(1, O_BINARY);
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
<C++言語の場合>
次の3種類試したけれどいずれもうまく行かない。
プログラム1
int main()
{
std::cin >> std::noskipws;
std::copy(
std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(),
std::ostream_iterator<char>(std::cout));
}
プログラム2(以下mainの本体のみ)
while (std::cin) {
char c;
std::cin.get(c);
std::cout.put(c);
}
プログラム3
while (std::cin) {
char c;
std::cin.read(&c, 1);
std::cout.write(&c, 1);
}
setf()ではだめで、これ以上思いつかず・・・
|