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

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

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

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Q&A

1回答

6445閲覧

行列ファイルを読み込んで、行列積を求めるc言語について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

0グッド

0クリップ

投稿2019/05/26 09:54

初めまして、rarararaです。
学校の宿題で、c言語で、4行3列の行列ファイルmat1.txt と、3行4列の行列ファイルmat2.txtを読み込み、
行列積を求める課題がでました。
以下のソースコードでビルドしてみると、エラーは出ませんでした。
しかし出力すると、ファイルをオープンできません。が冒頭2行に出てきます。
なので2つのファイルが開けていないことなのかと認識しています。
その下に数が出力されますが、0が多すぎて正直テキストファイルを開けていないことが問題なのか、ソースコードが問題なのか、どこが問題なのかわかりません。
また、テキストファイルはソースコード.cと同じファイルに入れております。

もしもわかる方がいましたら教えてください。
よろしくお願いします。

-------------ソースコード-------------
#include <stdio.h>

int main(void){
FILE *fp1,*fp2;
int i = 0, n;
char gyou[4][3];
char retu[3][4];
char naiseki[4][4];
int x,y;

fp1 = fopen("mat1.txt", "r"); if(fp1 == NULL){ printf("ファイルをオープンできません。\n"); } else { while(fscanf(fp1, "%s %s %s ", &gyou[i][0], &gyou[i][1], &gyou[i][2]) == 3) { for (i = 0; i < 4; i++) { fscanf(fp1, "%s %s %s ", &gyou[i][0], &gyou[i][1], &gyou[i][2]); } } } fp2 = fopen("mat2.txt", "r"); if(fp2 == NULL){ printf("ファイルをオープンできません。\n"); } else { while (fscanf(fp2, "%s %s %s %s\n", &retu[0][i], &retu[1][i], &retu[2][i], &retu[3][i]) == 4) { for (i = 0; i < 3; i++) { fscanf(fp2, "%s %s %s %s\n", &retu[0][i], &retu[1][i], &retu[2][i], &retu[3][i]); } } } for(y = 0;y < 5;y++){ puts("\n"); for(x = 0;x < 5;x++){ for(n = 0; n < 4;n++){ naiseki[y][x] += gyou[y][n]*retu[n][x]; printf("%3d", naiseki[y][x]); } } fclose(fp1); fclose(fp2); } return 0;

}

------------出力結果------------
ファイルをオープンできません。
ファイルをオープンできません。

------------テキストファイルmat1.txt------------

1 2 3
1 2 3
4 5 6
4 5 6
------------テキストファイルmat2.txt------------

1 2 3 4
1 2 3 4
4 5 6 7

補足情報(FW/ツールのバージョンなど)

Xcodeを用いています。

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

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

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

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

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

guest

回答1

0

オープンするファイルは実行ファイルのあるディレクトリに有りますか?

また、fopen()を失敗したらプログラムを終了させましょう。
終了してないので、後のforループで0が出力されるのだと思います。

投稿2019/05/26 10:23

cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2019/05/26 10:31

コメントありがとうございます。 実行ファイルは同じ場所にあります。 終了させるというのは、 ソースコードの下にある fclose(fp1); fclose(fp2); これとは別でしょうか?
cateye

2019/05/26 11:01 編集

macOSは余り触ったことがないのですが、ファイル名やパーミッションに間違いはないですよね? 開けなかったら、メッセージを出してreturnすればいいです。(retuun のパラメタは0以外がいいと思います・・・プログラム終了時のエラー判断が出来ます) 2個め(mat2.txt)の時は、mat1.txtはオープン済ですからclose()するのを忘れないように。
cateye

2019/05/26 11:09 編集

ソースのあるディレクトリで"cc ソースの名前.c"でコンパイルできますか? もしコンパイル出来たらa.outと言う実行ファイルが出来るはずなので、同一ディレクトリにmat1.txtとmat2.txtが有るのを確認の上実行してみて下さい。
cateye

2019/05/26 11:26 編集

あと、このままでは、配列の範囲外アクセスでコアダンプしますよ。配列の添字の範囲を確認しましょう。
episteme

2019/05/26 15:16

...突如退会するのってなんなんでしょね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問