はじめての C
先に進む前に、リストと入出力のところを ちょっと復習。
- /* mklist_1.c */
- #include
- struct List {
- int data;
- struct List *next;
- };
- struct List *get_mem(void);
- void show_list(struct List *);
- /* 線形リスト */
- main()
- {
- struct List *start, *curr, *prev;
- int n;
- /* データを格納してリストを繋ぐ */
- prev = NULL;
- while (scanf("%d", &n) != EOF) {
- curr = get_mem(); /* ノードの領域を確保 */
- curr->data = n; /* データを格納 */
- if (prev == NULL) {
- start = curr; /* 最初のノードへ */
- } else {
- prev->next = curr; /* ノードを繋ぐ */
- }
- prev = curr; /* 一つ前のノードを記憶 */
- }
- curr->next = NULL; /* リストの最後は NIL */
- /* データをリスト順に標準出力 */
- show_list(start);
- }
- struct List *get_mem(void) { /* メモリの確保 */
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) { /* 標準出力 */
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- printf("\n");
- }
- }
- /* mklist_2.c */
- #include
- struct List {
- int data;
- struct List *next;
- struct List *prev;
- };
- struct List get_mem(void);
- void show_list(struct List *);
- /* 双方向リスト */
- main()
- {
- struct List *start, *curr, *end;
- int n;
- end = start = NULL;
- while (scanf("%d", &n) != EOF) {
- curr = get_mem();
- curr->data = n;
- if (start == NULL) {
- start = curr;
- } else {
- end->next = curr; /* リストを繋ぐ */
- curr->prev = end;
- }
- end = curr; /* 一つ前のノードを記憶 */
- }
- curr->next = NULL;
- show_list(start);
- }
- struct List get_mem(void) {
- struct List *pm;
- pm = (struct List *)malloc(sizeof(struct List));
- return pm;
- }
- void show_list(struct List *pd) {
- while (pd != NULL) {
- printf("%d", pd->data);
- pd = pd->next;
- printf("\n");
- }
- }
- /* mkfile_1.c */
- #include
- /*
- * 標準入力から読み込み、指定したファイルへ書き込む
- * [Enter] [ctrl + d] で 入力終了。
- */
- int main(int argc, char *argv[])
- {
- FILE *fp;
- int c;
- if (argc < 2) {
- fprintf(stderr, "ファイル名を指定してネ\n");
- return 1;
- }
- fp = fopen(argv[1], "w"); /* ファイルを開く - "w" */
- if (fp == NULL) {
- fprintf(stderr, "ファイルが作成できないよ〜\n");
- return 2; /* 0 以外を返す */
- }
- /* 1バイトずつ入力して、ファイルに書き込む */
- while ((c = getchar()) != EOF) {
- putc(c, fp); /* fp は 第2引数 */
- }
- fclose(fp); /* ファイルを閉じる */
- return 0;
- }
- /* mkfile_2.c */
- #include
- /* 指定したファイルを読み込み、標準出力する */
- int main(int argc, char *argv[])
- {
- FILE *fp;
- int c;
- if (argc < 2) {
- fprintf(stderr, "ファイル名を指定してネ\n");
- return 1;
- }
- fp = fopen(argv[1], "r"); /* ファイルを開く - "r" */
- if (fp == NULL) {
- fprintf(stderr, "そんなファイルは あ り ま せ ん !\n");
- return 2;
- }
- /* ファイルから 1バイトずつ入力して、標準出力に表示 */
- while ((c = getc(fp)) != EOF) {
- putchar(c);
- }
- fclose(fp);
- return 0;
- }
(この前つくった song.txt を使って、$./mkfile_2 song.txt として確認)
- /* mkfile_3.c */
- #include
- /* 一つのファイルから他のファイルへ書き移す */
- int main(int argc, char *argv[])
- {
- FILE *fp_in;
- FILE *fp_out;
- int c;
- /* ファイル名が指定されているかを確認 */
- if (argc < 3) {
- fprintf(stderr, "ファイル名を指定してネ\n");
- return 1;
- }
- /* 入力ファイルを開く */
- fp_in = fopen(argv[1], "r");
- if (fp_in == NULL) {
- fprintf(stderr, "入力元ファイル(%s)がありませんヨ\n", argv[1]);
- return 2;
- }
- /* 出力ファイルを開く */
- fp_out = fopen(argv[2], "w");
- if (fp_out == NULL) {
- fprintf(stderr, "出力先ファイル(%s)がありませんネ\n", argv[2]);
- return 3;
- }
- /* 元のファイルから 1バイトずつ入力して、書き込み先のファイルへ出力 */
- while ((c = getc(fp_in)) != EOF) {
- putc(c, fp_out);
- }
- /* それぞれのファイルを閉じる */
- fclose(fp_in);
- fclose(fp_out);
- return 0;
- }
応用は まだまだムリだけど、なんとなく わかってきたような ...