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

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

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

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

Q&A

解決済

4回答

2737閲覧

c言語でファイル読み込みがうまくいきません。

iamisa

総合スコア2

C

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

0グッド

0クリップ

投稿2020/11/20 11:58

a.txtには複数行2列のデータが入っています。
最初にファイルを読み込み行数を出し、その行列を2次元配列に格納したいです。
for文で2次元配列を作ったのですが、出力がうまくいきません。
c言語初心者です。どなたかわかる方、教えていただきたいです、、、。

#include<stdio.h>
#define BUF_SIZE 256
int main(int argc, char *argv[])
{
FILE *fp;
char buf[BUF_SIZE];
int line = 0;
if ((fp = fopen("a.txt", "r")) == NULL) {
return -1;
}
while (fgets(buf, BUF_SIZE, fp) != NULL) {
line++;
}
printf("%d\n", line);//行数出力

int i,j,val[line][2];
for(i=0;i<line;i++){
for(j=0;j<2;j++){
fscanf(fp,"%d",&val[i][j]);
}
}

for(i=0;i<line;i++){
for(j=0;j<2;j++){
printf("%d",val[i][j]);
}
printf("\n");
}

fclose(fp);
return 0;
}

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

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

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

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

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

dodox86

2020/11/20 12:33

> int i,j,val[line][2]; のval[line][2]は可変長配列(VLA)と言ってC言語としては取り扱い要注意です。
dodox86

2020/11/20 12:36

また、出力が依然としてうまくいかないのであれば > a.txtには複数行2列のデータが入っています。 具体的にa.txtの内容を質問文に示しましょう。詳細が分からないと、誰も判断できません。
iamisa

2020/11/20 12:45

回答ありがとうございます。 そのようにします。ご指示ありがとうございます、、
guest

回答4

0

ファイルをオープンして、(行数を求めるために)fgetsで最後まで読んで、
こんどはfscanfしてますが、すでにファイルの最後になっているので、何も読めません。

案1:一度fcloseしてfopenし直してからfscanf(初心者にもわかりやすい)
案2:rewindfseekでファイルの先頭に戻る(ファイルストリームのファイル位置表示子という概念の理解が必要)

投稿2020/11/20 12:06

otn

総合スコア85901

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

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

iamisa

2020/11/20 12:20

回答ありがとうございます。 案1で実行してみたのですが、まだ出力がうまくいきません。他に問題があるのでしょうか?、
otn

2020/11/20 12:35

「うまくいかない」とは具体的にどういうことですか? 否定形で説明されると情報量がほぼゼロです。
iamisa

2020/11/20 12:43

a.txtには 110000528 110000031 110000529 110000059 110000033 110000531 110000031 110000062 、、、といった数値が入っており、(行数は1529行です)実行すると、 -101802376032767 00 00 00 149629177632767 -116759054632767 00 00 00 00 149629216032767 1101284421 という数が無数に並んでいます、、。
otn

2020/11/20 12:52

修正を間違えたんですかね。 あるいは、質問文のコードと違う物を実行しているとか。
guest

0

ベストアンサー

質問にコードを書くときは <code> ボタンを押して「コード」に #incude <stdio.h> から
} までのコードを上書きしてください。「ここに言語を入力」には C を上書きしてください。

C

1#include <stdio.h> 2 3#define BUF_SIZE 256 4 5int main(int argc, char *argv[]) 6{ 7 FILE *fp; 8 char buf[BUF_SIZE]; 9 int line = 0; 10 if ((fp = fopen("a.txt", "r")) == NULL) { 11 return -1; 12 } 13 while (fgets(buf, BUF_SIZE, fp) != NULL) { 14 line++; 15 } 16 printf("%d\n", line); //行数出力 17 18 rewind(fp); // ★ または fseek(fp, 0, SEEK_SET); 19 20 int i, j, val[line][2]; 21 for (i = 0; i < line; i++) { 22 for (j = 0; j < 2; j++) { 23 fscanf(fp, "%d", &val[i][j]); 24 } 25 } 26 27 for (i = 0; i < line; i++) { 28 for (j = 0; j < 2; j++) { 29 printf("%d", val[i][j]); 30 } 31 printf("\n"); 32 } 33 34 fclose(fp); 35 return 0; 36}

a.txt

text

1110000528 110000031 2110000529 110000059 3110000033 110000531 4110000031 110000062

実行結果

text

14 2110000528110000031 3110000529110000059 4110000033110000531 5110000031110000062

投稿2020/11/20 14:07

kazuma-s

総合スコア8224

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

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

iamisa

2020/11/20 16:50 編集

回答ありがとうございます。 もう一度やり直してみたところ出力することができました! その他コードの書き方など教えていただき、ありがとうございました!
guest

0

最初の

while (fgets(buf, BUF_SIZE, fp) != NULL) {

で、ファイルからの読出し位置が、ファイルの終わりになっています。そのため、次の fscanf()での読出しが出来ていません。

いくつか方法はありますが、fseek(fp, 0, SEEK_SET); で、ファイル位置をファイルの先頭に戻すか、bufで読み込んだ行データに対し、sscanf()で読み出すか、そのあたりでしょうか。

投稿2020/11/20 12:12

pepperleaf

総合スコア6385

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

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

iamisa

2020/11/20 12:22

回答ありがとうございます。 fseek(fp, 0, SEEK_SET); を加え実行してみたのですが、まだ出力がうまくいきません。他に問題があるのでしょうか?、、
guest

0

while (fgets(buf, BUF_SIZE, fp) != NULL) {

line++;
}

行数を出しているんでしょうけど、これによってファイルポインタはファイルの最後尾を指します。
この次のfscanfではファイルの最後を読むため、常に失敗します
ファイルポインタを先頭に設定し直す必要がありますね

投稿2020/11/20 12:04

y_waiwai

総合スコア88042

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

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

iamisa

2020/11/20 12:09

回答ありがとうございます。 ファイルポインタを先頭に設定し直すとは、具体的にどのように書いたら良いのでしょうか?、、、 c言語初心者なのですみません、。
iamisa

2020/11/20 12:23

ありがとうございます。考えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問