🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

5回答

2990閲覧

複数のファイルのデータを比較して計算する方法(C言語)

0126tami

総合スコア60

C

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

0グッド

0クリップ

投稿2019/10/30 06:07

編集2019/10/30 09:32

5×5の1と0によってランダムで作られたテキストファイルが3つあるとします。
その3つを比較してまた新しい 5×5を作りたいです。
3つの一つずつの場所の値全てかけて新たな値を作ります。
例えば3×3ですると、
100 101 111
111 101 111
010 101 111

3つを比較して
100
101
000

となるようなコードを作りたいです。

コードを書くことが苦手なのでアドバイスをいただけないかと思っています。
よろしくお願いいたします。

追記
fgetc関数を使ってみたのですが
最後の3つのテキストを1つのマスでかけて表示させる時に、ちゃんと1か0の数字が表示されません。
fgetcをintに変換する方法を教えてください
(atoi関数を使ってみてもダメでした)

c言語

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(void) { 5 FILE *fp; // FILE型構造体 6 static char fname1[] = "red.txt"; 7 static char fname2[]="green.txt"; 8 static char fname3[]="blue.txt"; 9 char str[16]; 10 int f1, f2, f3, f4, f5; 11 int l[25]; 12 int m[25]; 13 int n[25]; 14 int i,a,b,seki; 15 16 17 18 fp = fopen(fname1, "r"); // ファイルを開く。失敗するとNULLを返す。 19 if(fp == NULL) { 20 printf("%s file not open!\n", fname1); 21 return -1; 22 } 23 24 while((l[i]=fgetc(fp)) != EOF) { 25 i++; 26 27 } 28 printf("\n"); 29 fclose(fp); // ファイルを閉じる 30 31 32 33 34 fp = fopen(fname2, "r"); // ファイルを開く。失敗するとNULLを返す。 35 if(fp == NULL) { 36 printf("%s file not open!\n", fname2); 37 return -1; 38 } 39 i=0; 40while((m[i]=fgetc(fp)) != EOF) { 41 42i++; 43 44 } 45 printf("\n"); 46 fclose(fp); // ファイルを閉じる 47 48 49 50 51 52 fp = fopen(fname3, "r"); // ファイルを開く。失敗するとNULLを返す。 53 if(fp == NULL) { 54 printf("%s file not open!\n", fname3); 55 return -1; 56 } 57 i=0; 58 while((n[i]=fgetc(fp)) != EOF) { 59 60 61 i++; 62 63 } 64 printf("\n"); 65 66 67 fclose(fp); // ファイルを閉じる 68 69 70 71 72 i=0; 73 74 for(a=0;a<5;a++){ 75 76 for(b=0;b<5;b++){ 77 78 seki=l[i]*m[i]*n[i]; 79 printf("%c ",seki); 80 81// printf("%c ",l[i]); 試しにl[i]を表示させてみてもダメ 82 83 i++; 84 } 85 printf("\n"); 86 } 87 88 89 90 return 0; 91} 92 93 94 95

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

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

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

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

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

coco_bauer

2019/10/30 08:47

質問には「比較する」と書かれていますが、行われているのはビットの積演算(AND)のように思われます。 そうなのであれば、ファイルから読み込んだ"01011"というような文字列を2進数、0b01011、に変換し、あとはビット演算で処理するのが素直なのではないでしょうか。
guest

回答5

0

1つのテキストを配列として読み取るところ

ができるなら、それを3つ繰り返したら、3つの配列ができますね

投稿2019/10/30 06:09

y_waiwai

総合スコア88038

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

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

0126tami

2019/10/30 07:09

3つのテキストを配列として読み込んで出力するところまでできましたが 1行ずつ取り込んだものを マスごとに比較するやり方がわかりません泣
guest

0

まあ、fscanf を使うとできますが、どんなコードを書いたんでしょうか?

配列は要らないと思うんですが。

C

1#include <stdio.h> 2 3#define N 5 4 5int main(void) 6{ 7 FILE *fp1 = fopen("red.txt", "r"); 8 FILE *fp2 = fopen("green.txt", "r"); 9 FILE *fp3 = fopen("blue.txt", "r"); 10 if (!fp1 || !fp2 || !fp3) { puts("fopen failed"); return 1; } 11 12 for (int i = 0; i < N; i++) { 13 for (int j = 0; j < N; j++) { 14 int l, m, n; 15 fscanf(fp1, "%1d", &l); 16 fscanf(fp2, "%1d", &m); 17 fscanf(fp3, "%1d", &n); 18 printf("%d", l & m & n); 19 } 20 putchar('\n'); 21 } 22 fclose(fp1), fclose(fp2), fclose(fp3); 23}

投稿2019/10/30 17:10

kazuma-s

総合スコア8224

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

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

0

自己解決

fscanfを使うとできました

投稿2019/10/30 14:12

0126tami

総合スコア60

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

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

0

まあ、色々とありますが、、、

まず、最初の while()ループので使われている i が初期化されてません。値が不定です。 最近のコンパイラだと、教えてくれないでしょうか?

そして、 (ここからが、本題)
l[i]=fgetc(fp) (複数個所)で、ファイルを読み込んでいますが、これは、文字として読み込んでいます。

で、seki=l[i]*m[i]*n[i]; の計算ですが、掛け算の各項目は、文字です。従って、'1' x '0' とかの計算になります。 文字の '1'= 49(10進), '0'=48(10進) なので、その結果は、、49x48=2352。
`atoi()'は、文字列を数字にする関数なので、このままでは使えません。数字一文字だけなら、 '0' を引き算すれば、数字にできますが、その前に、数字かどうかの判定が必要となります。

printf("%c ",seki); これは、seki を文字とみなして、出力しますが、計算結果は、整数なので、期待する結果とはなりません。 printf("%d ",seki); あたりかと思いますが、まずは、その前の計算が正しくないと意味がありません。

... と言うところで、力尽きました。

投稿2019/10/30 12:51

pepperleaf

総合スコア6385

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

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

0126tami

2019/10/30 13:43

わたしの間違いをわかりやすく教えていただいてありがとうございます! ではもともとfgetcを使ったこと自体が間違っているのでしょうか?泣
pepperleaf

2019/10/31 12:28

間違ってはいないと思います。 ただ、読み込まれた結果は、数字で無く、文字。そこに注意が必要という事です。同じ '1' でも数字の 1と文字の1は異なるので注意が必要。
guest

0

やることの内容と,提示コードとの関係性が全く見えない.
(文字列やfloatを読込む記述が存在する意味がわからない)

1つのテキストを配列として読み取るところまではわかる

なら,そのコードを示して欲しい.

で,とりあえず,ファイルから要素値を読み込む処理はOKなのであれば,
ファイルから要素を読込みつつ,読み込んだ値と配列要素とを掛けて配列の内容を更新していけば良いのではないでしょうか.
すなわち,

//3x3の配列.最初は全て1で初期化しておく unsigned char Data[9] = { 1,1,1, 1,1,1, 1,1,1 }; for( ファイルの個数だけループ ) { for( 3x3の要素数分だけループ ) { 要素値をファイルから読み込む Data[]の該当要素 *= ファイルから読み込んだ値 } }

のような処理にすれば良いのでは,と思います.

投稿2019/10/30 07:04

編集2019/10/30 07:05
fana

総合スコア11985

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問