はじめての C

先に進む前に、リストと入出力のところを ちょっと復習。

  1. /* mklist_1.c */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. };
  7. struct List *get_mem(void);
  8. void show_list(struct List *);
  9. /* 線形リスト */
  10. main()
  11. {
  12. struct List *start, *curr, *prev;
  13. int n;
  14. /* データを格納してリストを繋ぐ */
  15. prev = NULL;
  16. while (scanf("%d", &n) != EOF) {
  17. curr = get_mem(); /* ノードの領域を確保 */
  18. curr->data = n; /* データを格納 */
  19. if (prev == NULL) {
  20. start = curr; /* 最初のノードへ */
  21. } else {
  22. prev->next = curr; /* ノードを繋ぐ */
  23. }
  24. prev = curr; /* 一つ前のノードを記憶 */
  25. }
  26. curr->next = NULL; /* リストの最後は NIL */
  27. /* データをリスト順に標準出力 */
  28. show_list(start);
  29. }
  30. struct List *get_mem(void) { /* メモリの確保 */
  31. struct List *pm;
  32. pm = (struct List *)malloc(sizeof(struct List));
  33. return pm;
  34. }
  35. void show_list(struct List *pd) { /* 標準出力 */
  36. while (pd != NULL) {
  37. printf("%d", pd->data);
  38. pd = pd->next;
  39. printf("\n");
  40. }
  41. }
  1. /* mklist_2.c */
  2. #include
  3. struct List {
  4. int data;
  5. struct List *next;
  6. struct List *prev;
  7. };
  8. struct List get_mem(void);
  9. void show_list(struct List *);
  10. /* 双方向リスト */
  11. main()
  12. {
  13. struct List *start, *curr, *end;
  14. int n;
  15. end = start = NULL;
  16. while (scanf("%d", &n) != EOF) {
  17. curr = get_mem();
  18. curr->data = n;
  19. if (start == NULL) {
  20. start = curr;
  21. } else {
  22. end->next = curr; /* リストを繋ぐ */
  23. curr->prev = end;
  24. }
  25. end = curr; /* 一つ前のノードを記憶 */
  26. }
  27. curr->next = NULL;
  28. show_list(start);
  29. }
  30. struct List get_mem(void) {
  31. struct List *pm;
  32. pm = (struct List *)malloc(sizeof(struct List));
  33. return pm;
  34. }
  35. void show_list(struct List *pd) {
  36. while (pd != NULL) {
  37. printf("%d", pd->data);
  38. pd = pd->next;
  39. printf("\n");
  40. }
  41. }
  1. /* mkfile_1.c */
  2. #include
  3. /*
  4. * 標準入力から読み込み、指定したファイルへ書き込む
  5. * [Enter] [ctrl + d] で 入力終了。
  6. */
  7. int main(int argc, char *argv[])
  8. {
  9. FILE *fp;
  10. int c;
  11. if (argc < 2) {
  12. fprintf(stderr, "ファイル名を指定してネ\n");
  13. return 1;
  14. }
  15. fp = fopen(argv[1], "w"); /* ファイルを開く - "w" */
  16. if (fp == NULL) {
  17. fprintf(stderr, "ファイルが作成できないよ〜\n");
  18. return 2; /* 0 以外を返す */
  19. }
  20. /* 1バイトずつ入力して、ファイルに書き込む */
  21. while ((c = getchar()) != EOF) {
  22. putc(c, fp); /* fp は 第2引数 */
  23. }
  24. fclose(fp); /* ファイルを閉じる */
  25. return 0;
  26. }
  1. /* mkfile_2.c */
  2. #include
  3. /* 指定したファイルを読み込み、標準出力する */
  4. int main(int argc, char *argv[])
  5. {
  6. FILE *fp;
  7. int c;
  8. if (argc < 2) {
  9. fprintf(stderr, "ファイル名を指定してネ\n");
  10. return 1;
  11. }
  12. fp = fopen(argv[1], "r"); /* ファイルを開く - "r" */
  13. if (fp == NULL) {
  14. fprintf(stderr, "そんなファイルは あ り ま せ ん !\n");
  15. return 2;
  16. }
  17. /* ファイルから 1バイトずつ入力して、標準出力に表示 */
  18. while ((c = getc(fp)) != EOF) {
  19. putchar(c);
  20. }
  21. fclose(fp);
  22. return 0;
  23. }

(この前つくった song.txt を使って、$./mkfile_2 song.txt として確認)

  1. /* mkfile_3.c */
  2. #include
  3. /* 一つのファイルから他のファイルへ書き移す */
  4. int main(int argc, char *argv[])
  5. {
  6. FILE *fp_in;
  7. FILE *fp_out;
  8. int c;
  9. /* ファイル名が指定されているかを確認 */
  10. if (argc < 3) {
  11. fprintf(stderr, "ファイル名を指定してネ\n");
  12. return 1;
  13. }
  14. /* 入力ファイルを開く */
  15. fp_in = fopen(argv[1], "r");
  16. if (fp_in == NULL) {
  17. fprintf(stderr, "入力元ファイル(%s)がありませんヨ\n", argv[1]);
  18. return 2;
  19. }
  20. /* 出力ファイルを開く */
  21. fp_out = fopen(argv[2], "w");
  22. if (fp_out == NULL) {
  23. fprintf(stderr, "出力先ファイル(%s)がありませんネ\n", argv[2]);
  24. return 3;
  25. }
  26. /* 元のファイルから 1バイトずつ入力して、書き込み先のファイルへ出力 */
  27. while ((c = getc(fp_in)) != EOF) {
  28. putc(c, fp_out);
  29. }
  30. /* それぞれのファイルを閉じる */
  31. fclose(fp_in);
  32. fclose(fp_out);
  33. return 0;
  34. }

応用は まだまだムリだけど、なんとなく わかってきたような ...