cd

cdは、指定のディレクトリに移動する。

cd man page

[bg1@localhost ~]$ ls
ダウンロード  デスクトップ  ビデオ  画像
テンプレート  ドキュメント  音楽    公開
[bg1@localhost ~]$ cd ドキュメント
[bg1@localhost ドキュメント]$ ls
[bg1@localhost ドキュメント]$

lsでファイル一覧を表示した後、cdで"ドキュメント"ディレクトリに移動。
lsしたが、中には何もなかった。

ls

Fedora31を新たに導入したので、簡単にコマンド解説でも・・・。
lsは、ファイル・ディレクトリ一覧を表示する。

Man page of LS

アクティビティから
アクティビティから

アクティビティをクリック。

暗くなったら検索ワードを入力
暗くなったら検索ワードを入力

暗くなったら検索ワードを入力。

"term"を入力すると「端末」が出てくる
"term"を入力すると「端末」が出てくる

"term"を入力すると「端末」が出てくる。

クリックで端末起動
クリックで端末起動

クリックで端末起動。

lsで何も指定がない時はその場所のファイル・ディレクトリ一覧を出力。
lsで何も指定がない時はその場所のファイル・ディレクトリ一覧を出力。

lsで何も指定がない時はその場所のファイル・ディレクトリ一覧を出力。

[bg1@localhost ~]$ ls
ダウンロード  デスクトップ  ビデオ  画像
テンプレート  ドキュメント  音楽    公開
[bg1@localhost ~]$

改めて、lsコマンドはこうなる。

StrokePath

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

creatは、openと同じでファイルを開くわけだが、openの第2引数に、O_CREAT|O_WRONLY|O_TRUNCのオプションを付けた状態と同じなので、既に存在しているファイルはサイズを0に切り詰めて、上書き保存のような形になる。

Man page of OPEN

/* ヘッダファイルのインクルード */
#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::setg

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

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

ENDは、Perlの終了前に実行される。
dieなどの強制終了でも呼ばれる。

初期処理、終了処理を定義する方法[Perl] : バヤシタ

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