cdは、指定のディレクトリに移動する。
[bg1@localhost ~]$ ls ダウンロード デスクトップ ビデオ 画像 テンプレート ドキュメント 音楽 公開 [bg1@localhost ~]$ cd ドキュメント [bg1@localhost ドキュメント]$ ls [bg1@localhost ドキュメント]$
lsでファイル一覧を表示した後、cdで"ドキュメント"ディレクトリに移動。
lsしたが、中には何もなかった。
StrokePathで、パスの輪郭を描画する。
StrokePath function (wingdi.h) - Win32 apps | Microsoft Docs
パス
パスはそのままでは描画できないので、こういう方法を取る。
輪郭と内側がわかるサイズ32のフォントを生成して選択させる。
EndPathの後に、StrokePathで輪郭が描画される。
輪郭が描画された。
文字列の周りが矩形で描画されてるのは、背景の矩形の輪郭も拾ってるから。
この辺はSetBkModeで背景を無効にすればいい。
Sample/winapi/StrokePath/StrokePath/src/StrokePath at master · bg1bgst333/Sample · GitHub
creatは、openと同じでファイルを開くわけだが、openの第2引数に、O_CREAT|O_WRONLY|O_TRUNCのオプションを付けた状態と同じなので、既に存在しているファイルはサイズを0に切り詰めて、上書き保存のような形になる。
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ #include <unistd.h> /* UNIX標準 */ #include <sys/types.h> /* 派生型 */ #include <sys/stat.h> /* ファイル状態 */ #include <fcntl.h> /* ファイル制御 */ /* main関数の定義 */ int main(void){ /* 変数の宣言 */ int fd1; /* ファイルディスクリプタfd1 */ /* ファイルを作成し, 書き込み. */ fd1 = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); /* openで"test.txt"を作成し, 開く. */ if (fd1 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(1)"); /* "open(1)とエラー内容をエラー出力. */ return -1; /* -1を返す. */ } /* "ABCDE"を書き込む. */ write(fd1, "ABCDE", 5); /* writeで"ABCDE"を書き込む. */ /* 閉じる. */ close(fd1); /* closeでfd1を閉じる. */ /* プログラムの終了 */ return 0; /* 0を返す. */ }
新規作成として、同じオプションをopenに指定。
$ vi creat.c $ gcc creat.c -o creat $ ./creat $ ls creat creat.c test.txt $ cat test.txt ABCDE$
新規作成され文字列が書き込まれる。
/* ヘッダファイルのインクルード */ #include <stdio.h> /* 標準入出力 */ #include <unistd.h> /* UNIX標準 */ #include <sys/types.h> /* 派生型 */ #include <sys/stat.h> /* ファイル状態 */ #include <fcntl.h> /* ファイル制御 */ /* main関数の定義 */ int main(void){ /* 変数の宣言 */ int fd1; /* ファイルディスクリプタfd1 */ int fd2; /* ファイルディスクリプタfd2 */ char buf[32]; /* サイズ32のchar型配列バッファbuf. */ /* ファイルを作成し, 書き込み. */ fd1 = open("test.txt", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); /* openで"test.txt"を作成し, 開く. */ if (fd1 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(1)"); /* "open(1)とエラー内容をエラー出力. */ return -1; /* -1を返す. */ } /* "ABCDE"を書き込む. */ write(fd1, "ABCDE", 5); /* writeで"ABCDE"を書き込む. */ /* 閉じる. */ close(fd1); /* closeでfd1を閉じる. */ /* ファイルを読み込み専用で開く. */ fd2 = open("test.txt", O_RDONLY); /* openで"test.txt"を読み込み専用で開く. */ if (fd2 == -1){ /* -1の時はエラー. */ /* エラー処理 */ perror("open(2)"); /* "open(2)とエラー内容をエラー出力. */ return -2; /* -2を返す. */ } /* "ABCDE"を読み込む. */ read(fd2, buf, 32); /* readで"ABCDE"を読み込む. */ /* bufを出力. */ printf("buf = %s\n", buf); /* printfでbufを出力. */ /* 閉じる. */ close(fd2); /* closeでfd2を閉じる. */ /* プログラムの終了 */ return 0; /* 0を返す. */ }
今度は読み込んでみる。
$ vi creat.c $ gcc creat.c -o creat $ ./creat buf = ABCDE $ ls creat creat.c test.txt $ cat test.txt ABCDE$
こうなる。
creatで開いて、"XYZ"を書き込む。
$ vi creat.c $ gcc creat.c -o creat $ ./creat buf = ABCDE $ ls creat creat.c test.txt $ cat test.txt XYZ$
"XYZ"に上書き保存されてる。
Sample/unixsyscall/creat/creat/src/creat at master · bg1bgst333/Sample · GitHub
basic_streambufのsetpが書き込み位置の情報をセットするものだとすると、setgは読み込み位置の情報をセットするもの。
https://ja.cppreference.com/w/cpp/io/basic_streambuf/setg
カスタムバッファ
setgには、バッファの最初の位置、現在位置、最後の位置をセットする。
std::basic_iostreamのioscにして、前回のようにストリームに書き込むだけじゃなく、ストリームから読み込むこともする。
print_gptrを追加し、
std::basic_streambuf<CharT,Traits>::eback, gptr, egptr - cppreference.com
basic_streambuf::gptrで、現在の読み込みポインタからの出力を見ることで、読み込みポインタが移動していく様子を見ていく。
$ vi basic_streambuf.cpp $ g++ basic_streambuf.cpp -o basic_streambuf $ ./basic_streambuf constructor buf_ = ?+b buf_ = ABC DEF GHI gptr() = ABC DEF GHI str1 = ABC gptr() = DEF GHI str2 = DEF, str3 = GHI????+b gptr() = $
ioscから読み込むたびにgptr()の位置が移動していくのがわかる。
Sample/cpp/basic_streambuf/setg/src/basic_streambuf at master · bg1bgst333/Sample · GitHub
putcは、fputcと同じく、指定されたストリームに、指定された1文字を書き込む。
ただし、putcはマクロ定義されている処理系もある。
そのため、複数回評価されることによる副作用を伴う式は、渡すべきではないとのこと。
fputc, putc - cppreference.com
今回はそのことではなく、戻り値を確認してみる。
putcや、fputcは、書き込みに成功すると書いた文字、失敗するとEOFを返す。
fcloseで閉じてから、書き込んだらどうなるか。
戻り値を出力。
$ vi putc.c $ gcc putc.c -o putc $ ls putc putc.c $ ./putc ret = 'F' $ ls putc putc.c test.txt $ cat test.txt ABCDE$
なんと、EOFではなく、指定した文字'F'を返してきた。
とはいえ、test.txtには書かれていない。
putcは、なかなか失敗しないということだろうか。
Sample/c/putc/putc/src/putc at master · bg1bgst333/Sample · GitHub
ENDは、Perlの終了前に実行される。
dieなどの強制終了でも呼ばれる。
CustomModule.pmで、
END、そしてerror_funcを用意。
error_funcの中で、dieを呼んでるが、その後に"error after!"と出力している。
#!/usr/bin/perl # CustomModuleをuseで読み込む. use CustomModule;
これだけでも、
$ vi END.pl $ perl END.pl This is BEGIN. This is END. $
ENDが呼ばれる。
error_funcを呼ぶと、
$ vi END.pl $ perl END.pl This is BEGIN. error_func. error! This is END. $
dieで強制終了するので、"error after!"は出力されない。
しかし、ENDは呼ばれる。
Sample/perl/END/END/src/END at master · bg1bgst333/Sample · GitHub