fork(4) download
  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. /* cucv: cutcsv アクセステキストのフィールド切り出し */
  7. /* とりあえず第一段階 cucv5.c 20180508
  8. 最後の改行いらないが、取り合えず何とか
  9. 第2項から切り出しの時の先頭のコンマもいらないがなんとなくこのまま
  10. しかし難関”、”処理に挑戦 何とか
  11. */
  12. /* K&R のCAT第2版を流用 
  13. 引数を入力ファイル名、切り出しフィールドの文字列にする
  14. 副関数はいらない 構造をシンプルに
  15. */
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19. FILE *fp;
  20. char *prog = argv[0]; /* プログラム名。エラー表示で使う */
  21. int c,n,hl;
  22. int fldno = 1; /*フィールド番号 */
  23. int dqflag = 0; /*ダブルコーテーション内のコンマ処理のためのフラグ*/
  24. int hikino; /* 引数番号比較*/
  25. char h;
  26.  
  27. /*エラー処理 引き数チェックなど*/
  28. if (argc == 1 || argc ==2){ /* 引数なし又はファイル名のみの場合:簡単な使い方 */
  29. fprintf(stderr, "%s:アクセステキストのフィールド切り出し\n", prog);
  30. exit (1);
  31. }
  32. if ((fp = fopen(argv[1], "r")) == NULL){ /* ファイルオープンは第一引数のみにする*/
  33. fprintf(stderr, "%s:ファイルオープン失敗 %s\n", prog, argv[1]);
  34. exit(1);
  35. }
  36. for (hikino = 2; hikino < argc; hikino++){ /*第2引数以降が自然数でない時 */
  37. /* 最大255くらいだから 文字列の各桁がASCI数値であることを確かめる
  38. 引数の長さ3文字以下、各文字が数であること、
  39. argv を 2次元配列としてアクセス こっちが難関だった*/
  40. hl = strlen(argv[hikino]);
  41. if ( hl > 3){
  42. fprintf(stderr,"%s:フィールド指定は整数3桁まで\n", prog);
  43. exit (1);
  44. }
  45. for ( n = 0 ; n < hl ; n++){
  46. h = argv[hikino][n];
  47. if (h < '0' || h > '9'){
  48. fprintf(stderr,"%s:フィールド指定は整数\n", prog);
  49. exit (1);
  50. }
  51. }
  52. }
  53.  
  54. /*本処理*/
  55. while((c = getc(fp)) != EOF){
  56.  
  57. /*ダブルコーテーションの処理 2個までコンマを数えないこと */
  58. if (c == '"' ) ++dqflag;
  59.  
  60. if (c == ',') {
  61. if( dqflag == 0) ++fldno;
  62. else if( dqflag == 2) {
  63. ++fldno;
  64. dqflag = 0;
  65. }
  66. }
  67. /*あとは全部の残った引数文字列の数値とfldnoが同じ時だけ出力する、でよいはず
  68. 1 フィールド数のカウント、変数fldnno 1で初期化
  69. 2 第3以降の引数との比較
  70. 3 合致してたら出力
  71. 4 そのうえで改行かどうかチェック、改行の時、fldnoを更新し、改行を出力する
  72. */
  73. for (hikino = 2; hikino < argc; hikino++)
  74. if (fldno == atoi(argv[hikino])) putc(c, stdout);
  75. if (c == '\n') {
  76. fldno = 1;
  77. putc(c, stdout);
  78. }
  79. }
  80. fclose(fp);
  81.  
  82. if (ferror(stdout)) {
  83. fprintf(stderr, "%s: 書き出し失敗\n", prog);
  84. /* K&Rから2つ目のエラー処理、書き出し失敗*/
  85. exit (2);
  86. }
  87. exit (0);
  88. }
  89.  
Runtime error #stdin #stdout #stderr 0s 4372KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
./prog:アクセステキストのフィールド切り出し