はじめに
花粉か黄砂かしらないけどくしゃみめっちゃでてくる。
キャスト
(int)c;
int(c);
先日の投稿の内容が間違っていたのでもう一度調べてみる。
#include <iostream>
int main(){
double a = 5.5;
double b = 5.5;
double c = 5.5;
std::cout << (int)a << std::endl;//出力結果 5
std::cout << int(b) << std::endl;//出力結果 5
std::cout << static_cast<int>(c) << std::endl;//出力結果 5
}
出力結果にどれも違いが見られなかったので、それぞれの違いは内容だとわかる。
(int)cについて
これは、明示的型変換という。今の型から強制的に違う型にする方法である。
しかし、このキャストは一時的な変換しかできない。
#include <iostream>
int main(){
double a = 5.5;
std::cout << (int)a << std::endl;//出力結果 5
std::cout << a << std::endl;//出力結果 5.5 ←ここでdoble型に戻っていることがわかる。
}
int(c)について
調べていたら、変数宣言と書いてあった。しかし、キャストとは無関係なので違うかもしれない。
もう少し調べてみる。
一応プログラムを書いてみたが (int)c
との違いは見られなかった。
#include <iostream>
int main(){
double a = 5.5;
std::cout << int(a) << std::endl;//出力結果 5
std::cout << a << std::endl;//出力結果 5.5
}
ロベールのC++
Argument Dependent Lookup(実引数依存の名前探索)
実引数依存の名前探索 とは、C++において関数呼出時に与えられた引数の型に依存して、呼び出す関数を探索 する仕組みのことである。(wikipedia参照)
この機能のおかげで、前の投稿の getline()
が std::getline()
と書かなくてもコンパイルエラーが出なかった理由である。ただこの機能は、便利だがコードを読みにくくする機能なので使わないほうがいい。 using namespace std
と同じで害悪である。
ファイルについて
コメント欄にて便利な方法を教えてもらったので試してみる。
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main() {
std::ifstream file;
file.open("test.txt");
if(!file){ //変更した
return EXIT_FAILURE;
}
std::string str;
str << file.rdbuf();//変更
std::cout << str << std::endl;
}
これでも文字を test.txt
からコピーできる。一応実行できて正しく出力できていた。
しかし、 operator error
がコンパイルで出てきた。今日は時間がないので明日また調べ直す。
08-06 テキストとバイナリ
ファイルは1バイト単位のデータが並んでいるだけ。ファイルんのデータ構造はメモリと変わらない。このデータを何も変換せずに出力するのが バイナリモード という。 しかし、バイナリモードでは何が書いてるのかわからないため、テキストモードがある。それがテキストファイルである。
c/c++では、改行コードは ¥n
に統一されている。しかし、これをwindowsのメモ帳で開くと、改行コードがwindowsと違うため改行がおかしくなる。
テキストモードだと、臨機応変に改行コードを変換してくれるが、バイナリモードだとその変換がない。
バイナリモードを開くときは ios::binary
を使うみたい。
終わりに
眠たいので調べ物が丁寧にできなかった。明日やろうと思う。
おやすみなさい