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

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

ただいまの
回答率

87.93%

パイプとc言語

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,956

score 11

前提・実現したいこと

dateからパイプして、日付を他言語でターミナルに表示できるようにしたいです。フランス語とドイツ語で曜日と月が書いてあるファイルが存在しています(fr.txtとger.txt)。
例えばfr.txtには
Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi
Janvier Fevrier Mars Avril Mai Juin Juillet Aout Septembre Octobre Novembre Decembre
のように書いてあります。これを使って
date | ./translation fr.txt
とターミナルに入力すると
Mon Jan 1 11:11:11 EDT 2016
のかわりに
Lundi Janvier 1 11:11:11 EDT 2016
と表示されるようにしたいです。
ドイツ語でも同様にしたいです。

試したこと

stdinから英語の日付をarrayにすることまでしか上手くいきませんでした。

`#include <stdio.h>

int main(void){
char eng[100];

while ((fgets(eng,sizeof(eng),stdin))!=NULL){
printf("%s",eng);
}
}

試したこと、その2

ynakanoさんに教えていただいたものとその後の経過の追加です。

int main(int argc,char *argv[]){

FILE *file;
char translated[100];

if(argc!=2){
printf("ERROR");
break;
}

if ((file = fopen(argv[1], "r"))==NULL) {
printf("ERROR");
break;
}

while (fgets(translated, 100, file) != NULL) {
if (engDay=0){
}
else if(engDay=1)

fclose(file);
return 0;
}

int engDay(void){

char engDay[100];

while ((fgets(engDay,sizeof(engDay),stdin))!=NULL){
}
}

int engMonth(void){

char engMonth[100];

while ((fgets(engMonth,sizeof(engMonth),stdin))!=NULL){

}
}

fgetsで一行丸ごとchar arrayに入れた後スペースごとに区切る方法がわからなくてつっかえてます。strncmpを曜日には使えるかなと思ったのですが、月にはdateの2語目で使えないので、スペースで区切ってcutみたいなことができないでしょうか?

よろしくお願いします!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2016/10/20 07:12

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 4

+2

プログラムを作らなくても、

LC_ALL=fr_FR date


でいいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/20 09:46

    そんなやり方もあるのですね!ためになります、ありがとうございます!ただ今回はこのやり方をしなければならないので、よかったらお知恵を貸してください。

    キャンセル

checkベストアンサー

0

敢えてCプログラムでやる場合のサンプルです

TZ=EDT date +'%w %m %-d %T %Z %Y' | ./translation fr.txt 
として実行してください。

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

int main(int argc,char *argv[])
{
    int i;
    if (argc != 2){
        printf("ファイルが指定されていません\n");
        return -1;
    }

    FILE *fp;
    char *fname =  argv[1];
    fp = fopen( fname, "r" );
    if( fp == NULL ){
        printf( "%sファイルが開けません¥n", fname );
        return -1;
    }

    char mbuf[12][20]={0};
    char wbuf[7][20]={0};

    fscanf(fp, "%s %s %s %s %s %s %s\n", wbuf[0], wbuf[1], wbuf[2], wbuf[3], wbuf[4], wbuf[5], wbuf[6]);
    fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s %s\n", mbuf[0], mbuf[1], mbuf[2], mbuf[3], mbuf[4],
        mbuf[5], mbuf[6], mbuf[7], mbuf[8], mbuf[9], mbuf[10], mbuf[11]);
    fclose( fp );

    int mon, week, day;
    char tim[10]={0}, zon[10]={0}, yar[10]={0};

    scanf("%d %d %d %s %s %s\n", &week, &mon, &day, tim, zon, yar);
    printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar);
    return 0;
}

すみません遅れてしまいました。急な野暮用が発生したので・・・・・

解説を付けさせて頂きます。まずこのプログラムの概要

Linuxのdateにて日付を取得する様にします、その際にタイムゾーンは
標準(EDT)にて表示、さらにweekdayは番号、0スタートの日曜日で出力
する様にします。

 TZ=EDT date +'%w %m %-d %T %Z %Y' と実行すると
 4 10 20 04:27:21 EDT 2016 が得られるとします。

上記の場合4なので木曜日になります。もし動きが変であればこの結果
が得られていないかをご確認ください。OSにより違う表示の場合が有る
かもしれません。

ご指定のファイルfr.txtは、日曜始まりになっているのでこれを利用
する事とします。
Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi

月は10ですので調度10番目の文字列とします。


以下ソースの中身とインラインにてご説明です。
    char mbuf[12][20]={0};
    char wbuf[7][20]={0};
//mbuf 月を格納するエリアを確保します。20文字×12の配列で初期値は00x00)とします。
//同様にwbufエリアを取ります。

    fscanf(fp, "%s %s %s %s %s %s %s\n", wbuf[0], wbuf[1], wbuf[2], wbuf[3], wbuf[4], wbuf[5], wbuf[6]);
    fscanf(fp, "%s %s %s %s %s %s %s %s %s %s %s %s\n", mbuf[0], mbuf[1], mbuf[2], mbuf[3], mbuf[4],
        mbuf[5], mbuf[6], mbuf[7], mbuf[8], mbuf[9], mbuf[10], mbuf[11]);
//ファイルfpから文字列と数字は一度に取得するfscanfを使ってwbuf配列に文字列を設定します。
//"%s %s %s %s %s %s %s\n"は、ブランクでセパレートされた7個の文字列のファイル1行の形を指定しています。
//fscanfは右から順にwbuf[0]へ1番目の文字列、wbuf[1]へ2番目と入れて7番目の配列に文字列を設定します。
//次のfscanfはファイルの二行目を読込み同様にmbufへ文字列を設定します。

    fclose( fp );

    int mon, week, day;
    char tim[10]={0}, zon[10]={0}, yar[10]={0};

    scanf("%d %d %d %s %s %s\n", &week, &mon, &day, tim, zon, yar);
//scanfは標準入力stdinからの読込みを行います。dateがパイプされたストリームが読み込まれます。
//このストリームには数字と文字列が混在しているので%dで数字、%sで文字列として各項目に値を設定します。

    printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar);
//printfは標準出力へのものです、その際weekは0スタートでしたのでそのまま配列で配置して月は1からのスタートなので-1を行い配置し%sにて出力します。
    return 0;
}

疑問がございますれば、お知らせください。

ちょっと書き方が良くないので修正しました。fscanfのセパレータのデフォルトはTAB,空白でした。

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

int main(int argc,char *argv[])
{
    int i;
    if (argc != 2){
        printf("ファイルが指定されていません\n");
        return -1;
    }

    FILE *fp;
    char *fname =  argv[1];
    fp = fopen( fname, "r" );
    if( fp == NULL ){
        printf( "%sファイルが開けません¥n", fname );
        return -1;
    }

    char mbuf[12][20] = {0};
    char wbuf[7][20] = {0};
    fscanf(fp,"%s%s%s%s%s%s%s", wbuf, wbuf+1, wbuf+2, wbuf+3, wbuf+4, wbuf+5, wbuf+6);
    fscanf(fp,"%s%s%s%s%s%s%s%s%s%s%s%s", mbuf, mbuf+1, mbuf+2, mbuf+3, mbuf+4,
        mbuf+5, mbuf+6, mbuf+7, mbuf+8, mbuf+9, mbuf+10, mbuf+11);
    fclose( fp );

    //date +'%w %m %-d %T %Z %Y' 4 10 20 09:53:08 JST 2016
    int mon, week, day;
    char tim[10]={0}, zon[10]={0}, yar[10]={0};
    scanf("%d%d%d%s%s%s", &week, &mon, &day, tim, zon, yar);
    printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar);
    return 0;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/20 13:10

    scanf("%d %d %d %s %s %s\n", &week, &mon, &day, tim, zon, yar);
    printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar);
    があまり理解できません。[week]の中に0とか1とか今日の曜日に当てはまる数字があるのだとは想像できるのですが。英語の曜日でchar arrayを作ってないのにどうやって動くのですか?今ちなみにいつも日曜日と0が出てきてしまいます。

    キャンセル

  • 2016/10/20 13:51

    できました!ありがとうございました!

    キャンセル

0

どうしてもプログラムで処理するにしても、提示内容だとfr.txtを読み込んでないですね。
ファイル名を引数にとってオープンするなら以下のような書き方になります。

int main(int argc, char *argv[]) {
  FILE *file;

  // 引数の数のチェック
  if(argc!=必要数){
    // エラー処理など
  }

  // ファイルオープンエラー
  if ((file = fopen(argv[1], "r"))==NULL) {
    // エラー処理
  }

  // 読み込んだファイルの処理

  fclose(file);
  return 0;
}


「C言語 コマンドライン引数」で調べてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/20 09:46

    とっても分かりやすく説明してくださりありがとうございます。修正したのでまたお力を貸していただけると助かります!

    キャンセル

  • 2016/10/20 10:04

    デリミタ指定で分割するならstrtok関数があります。

    キャンセル

0

translation.cでやることを書いておきます。

1.引数で入力された言語ファイルを開く
2.1行目を読み込んで、スペース区切りで分割し配列に入れる(曜日用配列 char dayofweek[7][100])
3.2行目を読み込んで、スペース区切りで分割し配列に入れる(月用配列 char mon[12][100])
4.言語ファイルをクローズ
5.標準入力から1行読み込む(dateコマンドの出力を読み込む)
6.曜日文字列(項目1)を取得し、Sun,Mon,...,Satの事前定義配列から位置(idx1)を求める(Monなら1)
7.月文字列(項目2)を取得し、Jan,Feb,...,Decの事前定義配列から位置(idx2)を求める(Janなら0)
8.項目3以降をそのまま保存(timestr: 11:11:11 EDT 2016)
9.結果を出力 printf("%s %s %s¥n", dayofweek[idx1], mon[idx2], timestr);

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/20 13:11

    とっても流れが分かりやすくなりました!ありがとうございます!

    キャンセル

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

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

関連した質問

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