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

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

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

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

Q&A

解決済

2回答

2236閲覧

(C言語)fscanfで数値をすべて読み取りたい

Gabriel_

総合スコア1

C

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

0グッド

0クリップ

投稿2021/06/26 07:49

前提・実現したいこと

fscanf構文を用いて数値を大きい順に並べるプログラムを作成したい。

発生している問題・エラーメッセージ

fscanfでファイル内の数値を読み込もうとした際に、最初の数値のみしか読みこんでくれず、数値を大きい順に並べることが出来ない。

該当のソースコード

#include <stdio.h> #include <stdlib.h> int main( void) { int i; int j; int k; double a[20]; FILE *fp; fp = fopen("xxxxxx.txt","r"); if (fp == NULL) { printf("ファイルが存在しません。\n"); exit (1); } fscanf( fp, "%lf", &a[i]); for ( i=0; i<20; i++ ){ for ( j=i+1; j<20; j++ ){ if (a[i] < a[j]){ k = a[i]; a[i] = a[j]; a[j] = k; } } } printf("トップ10は\n"); for ( i=0; i<10; i++ ){ printf("TOP %d: %f \n", i+1, a[i]); } return 0; fclose(fp); }

試したこと

根本として並べ替えをするソースコードが間違っているのかと思い、 double a[20] = {2.8, 10.4, 13.2, 6.0, .....}; としてファイルからの読み取りではなく入力した数値で並べ替えをしてみたのですが、その際はしっかりと並べ替えをしてくれました。

補足情報

読み込みたいテキストファイルの数値は
1.3
6.4
5.3
....
の様に1行ずつ改行して数値を入力してあります。

また、コンパイル時にエラー等は表示されません。

表示された実行結果

TOP 1: 1.300000
TOP 2: 0.000000
TOP 3: 0.000000
TOP 4: 0.000000
TOP 5: 0.000000
TOP 6: 0.000000
TOP 7: 0.000000
TOP 8: 0.000000
TOP 9: 0.000000
TOP 10: 0.000000

###教えて頂きたいこと
fscanfの使い方を学び、応用をしてみようと思いましたが意図した通りの挙動をしてくれませんでした。
どのように改善をしたら、fscanfが意図した通りに動くか教えて頂きたいです。

また、当サイトの使用が初めてで拙い質問方法であるかと思いますがどうかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

fscanfを1回しか実行していないので1つしかデータを読んでいないのは当然です。
総てのデータについてfscanfを実行しましょう。
その際にはiに適切な値をセット。

投稿2021/06/26 08:16

編集2021/06/26 08:28
otn

総合スコア85901

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

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

Gabriel_

2021/06/26 08:29

ありがとうございます。 ご教授頂いた通り1回しか実行できていなかったので fscanf( fp, "%lf", &a[i]); を for ( i=0; i<20; i++ ){ fscanf( fp, "%lf", &(a[i]) ); } として試みてみたところすべての値を読み取ってくれました。 また、その際読み込むファイルの中身を 1.4 6.3 5.3 4.7 10.6 9.8 2.3 4.5 6.6 3.3 17.9 22.3 2.9 6.1 56.8 44.3 33.7 7.8 9.1 106.3 としていたのですが、実行結果が小数のあるものやないもので統一されていないのですが、これはどのような改善をしたらよろしいでしょうか? 重ね重ね申し訳ありません。 実行結果↓ TOP 1: 106.300000 TOP 2: 56.000000 TOP 3: 44.000000 TOP 4: 33.000000 TOP 5: 22.000000 TOP 6: 17.000000 TOP 7: 10.000000 TOP 8: 9.000000 TOP 9: 9.000000 TOP 10: 7.000000
matukeso

2021/06/26 08:34

それはkがintだから起きてるバグ。
Gabriel_

2021/06/26 08:41

matukeso様 ご回答ありがとうございます。 k をintから別の型に変えたところ無事意図した通りに動いてくれました。       k = a[i]; a[i] = a[j]; a[j] = k; としていて、a[i]やa[j]の中身が小数点を含む数なので、kの型を適切な型にすれば良い という解釈でよろしいでしょうか?
otn

2021/06/26 09:49

Cは整数型変数と浮動小数点型変数が別なので、自分がこの場面でどの型を使うのかを決めて、その型にします。
otn

2021/06/26 10:03

あと、このプログラムは学習用でしょうから良いですが、通常のプログラムの場合はfscanfなどscanf系の関数は、返り値を必ずチェックしてエラー処理をしましょう。
Gabriel_

2021/06/26 11:16

otn様 詳しいご返信ありがとうございます。 まだ、C言語は学習段階で実用できるものでないですが、今後scanf系の関数を使用する際は返り値をチェックしてエラー処理をするよう心掛けたいと思います。 ありがとうございました。
guest

0

fscanf( fp, "%lf", &a[i]);

iが初期化されてません

投稿2021/06/26 07:58

y_waiwai

総合スコア88042

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

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

Gabriel_

2021/06/26 08:36

ご回答ありがとうございます。 iの初期化についても加えてみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問