はじめに
stocklistとロベールの順番を逆にすることにした。stockリストの調べる時間がかなり取られるので、先にロベールを終わらせて時間があればstockリストすることにした。
ロベールのC++
08-08 バイナリモードでの読み書き
ファイルの書き込みは大まかには2通りある。1つめは、データを文字にして書き込み、人がファイルを読める状態にする方法。2つめは、メモリ上のデータをそのまま書き込む方法。
今回は、2つ目の方法をやる。
#include <iostream>
#include <fstream>
#include <cstdlib>
int main(){
std::fstream file;
file.open("binary.txt", std::ios::out | std::ios::binary);
if(!file){
return EXIT_FAILURE;
}
int n = 0x41424344;
file.write((const char *)&n, sizeof n);
//nはint型の4バイト
//&nは4バイトの先頭アドレス
//出力結果は DCBA
file << n;
//この場合は、nの値は文字列として出力される。
//0x41424344を10進数に治すと1094861636になる
//出力結果は 1094861636
}
DCBA1094861636
実行結果は環境によって違う。
なぜなら、バイトの並び順が環境によって違うからである。そして、この並び順のことを バイトオーダ(エンディアン、エンディアンス)
という。その中でも、バイト数の大きい順と小さい順に分けることができる。大きい順は、 リトルエンディアン
。小さい順は、 ビッグエンディアン
という。
#include <iostream>
#include <fstream>
#include <cstdlib>
int main(){
std::fstream file;
file.open("binary.txt", std::ios::in | std::ios::binary);
if(!file){
return EXIT_FAILURE;
}
int n;
file.read((char*)&n, sizeof n);
//メモリ上にかいてあるものをそのままファイルに書き込んで、そのままメモリ上に戻しているだけなので、
//バイトオーダがビックでもリトルでも同じで、もとのデータが復元できる。
std::cout << n << std::endl;
}
08-09 ファイル操作のエラー処理
Hello! My name is Suponji
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstdlib>
const int WIDTH = 16;
int main() {
std::fstream file;
file.open("hello.txt", std::ios::in | std::ios::binary);
if(!file){
return EXIT_FAILURE;
}
do{
unsigned char buf[WIDTH];
file.read((char*)buf, sizeof buf);
for(int i = 0,size = file.gcount(); i < size; ++i) {
printf("%02X ", buf[i]);//
}
std::cout << std::endl;
}while(! file.eof());
}
このように、ファイルやメモリの中身を確認するために表示させることを「ダンプという」
明日は、このコードの解説とエラーが起きたときの対処法をする。
キャスト
以前教えていただいたURLがC+11のことがかなり詳しく書いている
int(c)の正体
int(c)
の正体は 関数形式の明示的型変換
である。関数みたいな見た目なので、関数形式って呼ぶみたい。そして、これを使えるのは、単純型指定子か、typename指定子である。単純型指定師とは、 int
とか double
とか char
とか他にもたくさんある。
このようなキャストもあるが、C++で安全にキャストがしたいならとりあえず、 static_cast
を使っていればOK!
とりあえず、今日はここまで。
終わりに
春休みが終わるので、規則正しい生活に戻さなければならない。。。