• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリ形式でデータの入出力をしたい)

バイナリ形式でデータの入出力をしたい

このQ&Aのポイント
  • バイナリ形式でデータを読み書きする方法について教えてください
  • STLやstringが規格化されていない時代の古いC++の本しか持っていない私の唯一の教科書はマイクロソフトのライブラリだけです。しかし、バイナリデータの読み書きについてどこに必要な情報が載っているかわかりません。
  • バイナリファイルの読み込みや書き込みに対して、ifstreamやofstreamを使用していますが、これが正しいやり方なのか確認したいです。特にファイルモードのios::truncについても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

> ofs.open("gomi",ios::out|ios::binary); > と書くことが有効な場合はどんな場合でしょうか? ファイルの一部を書き換えたいとき。

その他の回答 (6)

回答No.6

> ...writeするとファイルの末尾に追加されると思ってます?違いますよ。 からどうやって > どちらでもかまわないということですね という結論が導き出せるんだろう...

nubou
質問者

補足

データをつぶして書きたい場合は ofs.open("gomi",ios::out|ios::binary|ios::trunc); と書けば良いことは分かりました では ofs.open("gomi",ios::out|ios::binary); と書くことが有効な場合はどんな場合でしょうか?

回答No.5

> 先頭から12個読み込んでみると0から8だけが取りこまれました > つまり切り詰めなくても0から3は「切り詰められる」ようです ...writeするとファイルの末尾に追加されると思ってます?違いますよ。

nubou
質問者

お礼

上書きしたいときには ofs.open("gomi",ios::out|ios::binary|ios::trunc); とかいても ofs.open("gomi",ios::out|ios::binary); とかいても どちらでもかまわないということですね 詳しく説明ありがとうございました

回答No.4

> 切り詰めるというマイクロソフトの説明も定義が書いていないのでわからないし あれ?僕もMSDN検索しましたが、 app - to seek to the end of a stream before each insertion. ate - to seek to the end of a stream when its controlling object is first created. binary, to read a file as a binary stream, rather than as a text stream. in - to permit extraction from a stream. out, to permit insertion to a stream. trunc - to delete contents of an existing file when its controlling object is created <--- !!! しっかりきっちり書いてあります。

回答No.3

> そもそも切り詰めるとはいったいどう言う意味なのでしょうか? 既存のファイルをオープンしたとき、そのファイルの中身を捨てる(長さを0にする)ってことです。 だからやっぱりバイナリモードとは関係ありません。

nubou
質問者

お礼

いろいろ数値を変えて実験しているのですが 0から3をファイル1に切り詰めて書き込み 0から7をファイル1に切り詰めて書き込みんでも 0から7をファイル1に切り詰めないで書き込みんでも 先頭から12個読み込んでみると0から8だけが取りこまれました つまり切り詰めなくても0から3は「切り詰められる」ようです #include <string> #include <iostream> #include <fstream> using namespace std; void main(void) { int i,j; ifstream ifs; ofstream ofs; string str; char c; unsigned char s[256],z[256]; for(i=0;i<256;i++)z[i]=0; for(i=0;i<256;i++)s[i]=i; ofs.open("gomi",ios::out|ios::binary|ios::trunc); ofs.write(s,4);ofs.close(); ofs.close(); ofs.open("gomi",ios::out|ios::binary); //ofs.open("gomi",ios::out|ios::binary|ios::trunc); ofs.write(s,8);ofs.close(); ofs.close(); ifs.open("gomi",ios::in|ios::binary); ifs.read(z,16);ifs.close(); for(i=0;i<16;i++)cout<<int(z[i])<<","; exit(1); }

回答No.2

> 書きこむ前にファイルデータが存在しても上書きする場合に切り詰める必要はないのですね? なぜやってみないんです? 切り詰めるか否かはバイナリモードとは関係ありません!

nubou
質問者

補足

やってはいるのですが両者の差が検出できないのです 切り詰めつというマイクロソフトの説明も定義が書いていないのでわからないし ちなみに検査プログラムは #include <string> #include <iostream> #include <fstream> using namespace std; void main(void) { int i,j; ifstream ifs; ofstream ofs; string str; char c; unsigned char s[256],z[256]; for(i=0;i<256;i++)s[i]=i; ofs.open("gomi",ios::out|ios::binary|ios::trunc); ofs.write(s,8);ofs.close(); ofs.close(); ofs.open("gomi",ios::out|ios::binary); //ofs.open("gomi",ios::out|ios::binary|ios::trunc); ofs.write(s,16);ofs.close(); ofs.close(); ifs.open("gomi",ios::in|ios::binary); ifs.read(z,16);ifs.close(); for(i=0;i<16;i++)cout<<int(z[i])<<","; exit(1); } です そもそも切り詰めるとはいったい同言う意味なのでしょうか?

回答No.1

問題ないと思います。 ios::truncはバイナリモードとは関係ありません。

nubou
質問者

補足

関係ありません。: ということは ofs.open("outfile.exe",ios::out|ios::binary|ios::trunc); とかくところを ofs.open("outfile.exe",ios::out|ios::binary); としても言いということですね 書きこむ前にファイルデータが存在しても上書きする場合に切り詰める必要はないのですね?

関連するQ&A