- ベストアンサー
バイナリ形式でデータの入出力をしたい
- バイナリ形式でデータを読み書きする方法について教えてください
- STLやstringが規格化されていない時代の古いC++の本しか持っていない私の唯一の教科書はマイクロソフトのライブラリだけです。しかし、バイナリデータの読み書きについてどこに必要な情報が載っているかわかりません。
- バイナリファイルの読み込みや書き込みに対して、ifstreamやofstreamを使用していますが、これが正しいやり方なのか確認したいです。特にファイルモードのios::truncについても教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> ofs.open("gomi",ios::out|ios::binary); > と書くことが有効な場合はどんな場合でしょうか? ファイルの一部を書き換えたいとき。
その他の回答 (6)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> ...writeするとファイルの末尾に追加されると思ってます?違いますよ。 からどうやって > どちらでもかまわないということですね という結論が導き出せるんだろう...
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 先頭から12個読み込んでみると0から8だけが取りこまれました > つまり切り詰めなくても0から3は「切り詰められる」ようです ...writeするとファイルの末尾に追加されると思ってます?違いますよ。
お礼
上書きしたいときには ofs.open("gomi",ios::out|ios::binary|ios::trunc); とかいても ofs.open("gomi",ios::out|ios::binary); とかいても どちらでもかまわないということですね 詳しく説明ありがとうございました
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 切り詰めるというマイクロソフトの説明も定義が書いていないのでわからないし あれ?僕も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 <--- !!! しっかりきっちり書いてあります。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> そもそも切り詰めるとはいったいどう言う意味なのでしょうか? 既存のファイルをオープンしたとき、そのファイルの中身を捨てる(長さを0にする)ってことです。 だからやっぱりバイナリモードとは関係ありません。
お礼
いろいろ数値を変えて実験しているのですが 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); }
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 書きこむ前にファイルデータが存在しても上書きする場合に切り詰める必要はないのですね? なぜやってみないんです? 切り詰めるか否かはバイナリモードとは関係ありません!
補足
やってはいるのですが両者の差が検出できないのです 切り詰めつというマイクロソフトの説明も定義が書いていないのでわからないし ちなみに検査プログラムは #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); } です そもそも切り詰めるとはいったい同言う意味なのでしょうか?
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
問題ないと思います。 ios::truncはバイナリモードとは関係ありません。
補足
関係ありません。: ということは ofs.open("outfile.exe",ios::out|ios::binary|ios::trunc); とかくところを ofs.open("outfile.exe",ios::out|ios::binary); としても言いということですね 書きこむ前にファイルデータが存在しても上書きする場合に切り詰める必要はないのですね?
補足
データをつぶして書きたい場合は ofs.open("gomi",ios::out|ios::binary|ios::trunc); と書けば良いことは分かりました では ofs.open("gomi",ios::out|ios::binary); と書くことが有効な場合はどんな場合でしょうか?