質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

コマンドラインで英語が書き込まれない件について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 646

score 9

前提・実現したいこと

C言語のプログラムでコマンドラインから文字を受け取るようにしたい

発生している問題・エラーメッセージ

エラーメッセージは特になく、
数字なら書き込まれるのですが、英語が書き込まれません。

該当のソースコード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
 char line[80];
 if( argc != 6)
 {
  fprintf(stderr, "5つの引数を指定して下さい。\n");
  return 1;
 }
 FILE *in = fopen("spooky.csv", "r");
 FILE *file1 = fopen(argv[2], "w");
 FILE *file2 = fopen(argv[4], "w");
 FILE *file3 = fopen(argv[5], "w");
 while(fscanf(in, "%79[^\n]", line) == 1){
 if(strstr(line, argv[1]))
        fprintf(file1, "%s\n", line);
 else if (strstr(line, argv[3]))
        fprintf(file2, "%s\n", line);
 else
        fprintf(file3, "%s\n", line);
 }
 fclose(file1);
 fclose(file2);
 fclose(file3);
 return 0;
}

試したこと

数字なら読み込まれることを確認
>./categorize 30 aliens.csv 28 elvises.csv the_rest.csv
>more aliens.csv
30.685163,-68.137207,Type=Yeti

>./categorize Type aliens.csv Ship elvises.csv the_rest.csv
>more aliens.csv

  ↑何も返さないことを確認しました。

補足情報

OS:macOS Sierra
環境:gcc
ソース編集及びコンパイルはターミナルを使用しました。

以下はspooky.csvの内容になります。
30.685163,-68.137207,Type=Yeti
28.304380,-74.575195,Type=UFO
29.132971,-71.136475,Type=Ship
28.343065,-62.753906,Type=Elvis
27.868217,-68.005371,Type=Goatsucker
30.496017,-73.333740,Type=Disappearance
26.224447,-71.477051,Type=UFO
29.401320,-66.027832,Type=Ship
37.879536,-69.477539,Type=Elvis
22.705256,-68.192139,Type=Elvis
27.166695,-87.484131,Type=Elvis

以上です。どなたか知見がある方、ご教示いただけると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2019/08/30 15:15

    プログラムが見にくいので、プログラムの前に
    ```C
    という行を、プログラムの後に
    ```
    という行を入れてください。他の人の質問のように見やすくなります。

    キャンセル

  • y_waiwai

    2019/08/30 15:23

    このままではコードが見づらいので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください

    キャンセル

  • HTan

    2019/09/03 08:07

    修正しました。見にくくて申し訳ございませんでした。

    キャンセル

回答 2

checkベストアンサー

+1

現象が再現しません(ちゃんと表示されます)。

このプログラムだと、1行目しか読まないので、それで勘違いしているのでは?

2行目以降も読むなら、fscanf(in, "%79[^\n] ", line)にしてください。
もっといいのは、fscanfを捨てて、fgetsを使うことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 08:25

    fgetsを使用したところ、ファイルに書き込まれるようになりました。
    なぜfscanfではダメなのかが気になるところです。。

    キャンセル

  • 2019/09/03 11:47

    scanf/fscanfの書式指定は、非常に難しいからです。

    キャンセル

  • 2019/09/03 17:52

    現象が改善されたので、ベストアンサーにさせていただきました。ご協力いただきありがとうございました。

    キャンセル

+1

確かに現象を観察することも重要なんですけど、単なる結果から一歩踏み込んで変数やなにかがどうなっているんだろう、と調べていくのがよろしいかと。
デバッガの使い方を覚えるのも今後のためにとても役に立つかと思いますけれど、とりあえず

    printf( /////DEBUG (デバッグが終わったら忘れず削除するため特定のコメント文字列をつけておく)
    "argv[1]:'%s'\n"  /////DEBUG
    "argv[3]:'%s'\n" /////DEBUG
    "argv[5]:'%s'\n",  /////DEBUG
    argv[1],argv[3],argv[5]);  /////DEBUG
    while(fscanf(in, "%79[^\n]", line) == 1){
      printf("line:'%s', %dchars\n",line,strlen(line)); /////DEBUG 見えない文字が紛れ込んでいないか知るために文字数も表示。
      char* p=line; /////DEBUG ダンプ表示もしてみる
      while(*p++){ /////DEBUG
        printf("%02x "); /////DEBUG
      } /////DEBUG
      printf("\n"); /////DEBUG
      if(strstr(line, argv[1])) { //小細工をするときのため、単文であっても{ }で囲む習慣をつけておいてもいいかも
        printf("%s:%s\n",argv[1],line); /////DEBUG 画面上でも確認
        fprintf(file1, "%s\n", line);
      } else if (strstr(line, argv[3])) {
        fprintf(file2, "%s\n", line);
      } else {
        fprintf(file3, "%s\n", line); 
      }


とでもして、表示された結果を観察してみるとなにか見えてきたりしないでしょうか。
俗に言うprintfデバッグというやつです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 08:16

    printfデバッグを試してみました。
    文字はコマンドで指定したものが、表示されておりました。
    何故このような結果になっているかがよくわかりません。
    ただこの方法はとても役立ちそうなので、今後参考にさせていただきます。
    ご回答いただきありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る