LoginSignup
3
1

More than 5 years have passed since last update.

はじめてのC++ 【36日目】

Posted at

はじめに

stocklistとロベールの順番を逆にすることにした。stockリストの調べる時間がかなり取られるので、先にロベールを終わらせて時間があればstockリストすることにした。

ロベールのC++

08-08 バイナリモードでの読み書き

ファイルの書き込みは大まかには2通りある。1つめは、データを文字にして書き込み、人がファイルを読める状態にする方法。2つめは、メモリ上のデータをそのまま書き込む方法。
今回は、2つ目の方法をやる。

biFile.cpp
#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
}
binary.txt
DCBA1094861636

実行結果は環境によって違う。
なぜなら、バイトの並び順が環境によって違うからである。そして、この並び順のことを バイトオーダ(エンディアン、エンディアンス) という。その中でも、バイト数の大きい順と小さい順に分けることができる。大きい順は、 リトルエンディアン。小さい順は、 ビッグエンディアン という。

2bfile.cpp
#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.txt
Hello! My name is Suponji
4file.cpp
#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());

}

スクリーンショット 2019-04-07 23.36.10.png
このように、ファイルやメモリの中身を確認するために表示させることを「ダンプという」

明日は、このコードの解説とエラーが起きたときの対処法をする。

キャスト

以前教えていただいたURLがC+11のことがかなり詳しく書いている

int(c)の正体

int(c) の正体は 関数形式の明示的型変換 である。関数みたいな見た目なので、関数形式って呼ぶみたい。そして、これを使えるのは、単純型指定子か、typename指定子である。単純型指定師とは、 int とか double とか char とか他にもたくさんある。
このようなキャストもあるが、C++で安全にキャストがしたいならとりあえず、 static_cast を使っていればOK!
とりあえず、今日はここまで。

終わりに

春休みが終わるので、規則正しい生活に戻さなければならない。。。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1