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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

2802閲覧

パイプとc言語

Marin0829

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/10/19 17:39

編集2016/10/20 00:47

###前提・実現したいこと
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みたいなことができないでしょうか?

よろしくお願いします!

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

Bash

1LC_ALL=fr_FR date

でいいです。

投稿2016/10/19 22:14

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marin0829

2016/10/20 00:46

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

0

ベストアンサー

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

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

c

1#include <stdio.h> 2#include <string.h> 3 4int main(int argc,char *argv[]) 5{ 6 int i; 7 if (argc != 2){ 8 printf("ファイルが指定されていません\n"); 9 return -1; 10 } 11 12 FILE *fp; 13 char *fname = argv[1]; 14 fp = fopen( fname, "r" ); 15 if( fp == NULL ){ 16 printf( "%sファイルが開けません¥n", fname ); 17 return -1; 18 } 19 20 char mbuf[12][20]={0}; 21 char wbuf[7][20]={0}; 22 23 fscanf(fp, "%s %s %s %s %s %s %s\n", wbuf[0], wbuf[1], wbuf[2], wbuf[3], wbuf[4], wbuf[5], wbuf[6]); 24 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], 25 mbuf[5], mbuf[6], mbuf[7], mbuf[8], mbuf[9], mbuf[10], mbuf[11]); 26 fclose( fp ); 27 28 int mon, week, day; 29 char tim[10]={0}, zon[10]={0}, yar[10]={0}; 30 31 scanf("%d %d %d %s %s %s\n", &week, &mon, &day, tim, zon, yar); 32 printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar); 33 return 0; 34}

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

解説を付けさせて頂きます。まずこのプログラムの概要 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の配列で初期値は0(0x00)とします。 //同様に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,空白でした。

c

1#include <stdio.h> 2#include <string.h> 3 4int main(int argc,char *argv[]) 5{ 6 int i; 7 if (argc != 2){ 8 printf("ファイルが指定されていません\n"); 9 return -1; 10 } 11 12 FILE *fp; 13 char *fname = argv[1]; 14 fp = fopen( fname, "r" ); 15 if( fp == NULL ){ 16 printf( "%sファイルが開けません¥n", fname ); 17 return -1; 18 } 19 20 char mbuf[12][20] = {0}; 21 char wbuf[7][20] = {0}; 22 fscanf(fp,"%s%s%s%s%s%s%s", wbuf, wbuf+1, wbuf+2, wbuf+3, wbuf+4, wbuf+5, wbuf+6); 23 fscanf(fp,"%s%s%s%s%s%s%s%s%s%s%s%s", mbuf, mbuf+1, mbuf+2, mbuf+3, mbuf+4, 24 mbuf+5, mbuf+6, mbuf+7, mbuf+8, mbuf+9, mbuf+10, mbuf+11); 25 fclose( fp ); 26 27 //date +'%w %m %-d %T %Z %Y' 4 10 20 09:53:08 JST 2016 28 int mon, week, day; 29 char tim[10]={0}, zon[10]={0}, yar[10]={0}; 30 scanf("%d%d%d%s%s%s", &week, &mon, &day, tim, zon, yar); 31 printf("%s %s %d %s %s %s\n", wbuf[week], mbuf[mon-1], day, tim, zon, yar); 32 return 0; 33}

投稿2016/10/20 01:19

編集2016/10/20 07:07
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marin0829

2016/10/20 04: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が出てきてしまいます。
Marin0829

2016/10/20 04:51

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

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 01:07

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marin0829

2016/10/20 04:11

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

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/19 23:26

ynakano

総合スコア1894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marin0829

2016/10/20 00:46

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

2016/10/20 01:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問