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

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

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

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

2回答

4284閲覧

[C言語]ファイルからfscanfを用いて数値を読み込み、ファイル末尾になったらwhile(1)ループを抜け出したい

sine_sign

総合スコア1

C

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

1クリップ

投稿2021/05/16 08:31

前提・実現したいこと

ファイルからfscanfを用いて数値を読み込み、ファイル末尾になったらwhile(1)ループを抜け出したい

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

whileループを抜けられない

該当のソースコード

#include<stdio.h> #include<stdlib.h> int main(void){ FILE *fp; double x[5],y[5]; int i=0; if((fp=fopen("input.txt","r"))==NULL){ fprintf(stderr,"FILE OPEN ERROR"); exit(1) } while(1){ if(fscanf(fp,"(%lf,%lf)",&x[i],&y[i])==EOF) break; else{ printf("(%lf,%lf)",x[i],y[i]); i++; } } fclose(fp); return 0; }

困っていること

テキストファイルからfscanfで数値を読み込み、ファイル末尾の場合終了、そうでない場合読み込んだ数値を画面表示するプログラムを書きたいのですが、whileループを抜けられずセグメンテーション違反となってしまいます。

またif文の条件文について、if(fscanf~)とした場合、その時点でfscanfが実行されたことになるのでしょうか。(つまりelse文でfscanfを書く必要があるのかどうか)

なおよくある方法としてwhile((fscanf~)!=EOF)とする方法がありますが、今回はwhile(1)としてif文を使ってwhileを抜ける方法を考えたいです。

補足情報

input.txtの内容

(1.0,2.0) (-3.0,4.5) (2.5,5.0) (4.0,2.8)

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

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

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

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

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

guest

回答2

0

ベストアンサー

if(fscanf(fp,"(%lf,%lf)",&x[i],&y[i])==EOF) break;

これ、ダメです。 fscanf()の仕様を確認しましょう。
戻り値は、読み込んだ数です。 今回の場合、2個読んでいるので、(ざっくり) fscanf() != 2でしょうか。
既に回答があるように、\nも必要でしょうが、、。

[追記]

(1.1,1.2) (1.3,1.4)

みたいに正しい数値のみがあるファイルでは、EOFが返りました。
ただ、最後に ()みたいに不正なデータがある場合、その場所での戻り値は、0でした。

投稿2021/05/16 08:54

編集2021/05/16 09:15
pepperleaf

総合スコア6385

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

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

itagagaki

2021/05/16 08:57

入力が終端に達したらEOFが返るので間違いではないです。
y_waiwai

2021/05/16 09:02

まあ、ファイルに変換できない文字があったらそれでは無限ループになりますけどね
pepperleaf

2021/05/16 09:03

手元だと、返らないですね。(Visual studio 2019環境) 方法が悪いのかは未確認ですが、、。
dodox86

2021/05/16 09:23 編集

itagagakiさんのご回答での処置後、あえて加えるならループの回数上限を設ける、でしょうか。現状、5行を超えるファイルのデータだと問題が出ます。
sine_sign

2021/05/16 09:29

原因分かりました、テキストファイルの方の記述が間違っていた((4,0),(2.8)になっていました。 変なミスで申し訳ありませんでした。回答ありがとうございました。
guest

0

fscanf(fp,"(%lf,%lf)\n"...にすれば(\nを加えれば)とりあえずは解決すると思います。

if(fscanf~)とした場合、その時点でfscanfが実行されたことになるのでしょうか

これはそのとおりです。

投稿2021/05/16 08:47

itagagaki

総合スコア8402

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

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

sine_sign

2021/05/16 08:58

回答ありがとうございます。fscanf(fp,"(%lf,%lf)\n"...として実行してみましたが、症状は変わりませんでした、、、
itagagaki

2021/05/16 09:02

質問に書かれたコードに\nを加えてをコンパイルし(exit(1)にセミコロンを付ける必要がありましたが)、 質問に書かれたinput.txtを置いて実行してみたら問題なく実行できました。 ご報告まで。
sine_sign

2021/05/16 09:25

試しにvisual studio code 2019で実行してみたら問題なく動きました。環境による違いなのでしょうか。。。
sine_sign

2021/05/16 09:29

原因分かりました、テキストファイルの方の記述が間違っていた((4,0),(2.8)になっていました。 変なミスで申し訳ありませんでした。回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問