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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1135閲覧

C++へのfscanf()適用

bldtemporal

総合スコア35

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/12/05 03:49

前提・実現したいこと

C言語では、
a=0.03, B=0.1,I=50,dT=2e-6 を、0.03,0.1,50,2e-6として、Data1.txtと名付けて保存し、

const double a,b.dT;
int I1,I2;
fscanf(fp, "%f,%f,%d%le",a,b,I);

printf("\nData1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a,b,I,dT); //--confirm input data
でプログラムに入力しています。もちろん、その前に下記を実行しています。

FILE *fp;
fp=fopen("Data1.txt", "r");
if((fp = fopen("Data.txt", "r")) == NULL) {
printf("\n Data1 file open failure !!\n");
}

C++においても、これと同じに変数を明らかにして入力したいのですが、できません。"Data file open failure"
と表示されます。ifstream ifs()とか試してみたのですが、うまくいきません。
Webの記事では、c言語と同じに、fscanf()が使える、と述べられております。何か方法がありましたら、お教え下さい。■■な機能を実装中に以下のエラーメッセージが発生しました。

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

Data1 file open failure
エラーメッセージ

### 該当のソースコード C++ ### 試したこと ヘッダーに#include<cstdio>, #include<cstdlib>,#include<iostream> #include<fstream>を入れ、 getline(ifstream ifs, ・・・)など試してみましたが、駄目でした。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2021/12/05 06:55 編集

> fp=fopen("Data1.txt", "r"); if((fp = fopen("Data.txt", "r")) == NULL) { なぜ「fopen」を2回やってるのでしょうか? しかも、ファイル名を変えて 「fopen」したい(実際に存在してる)ファイルの名前は、「Data1.txt」と「Data.txt」のどちらなのでしょうか? > a=0.03, B=0.1,I=50,dT=2e-6 を、0.03,0.1,50,2e-6として、Data1.txtと名付けて保存 が正しいのなら、「Data1.txt」は存在するけど「Data.txt」は存在しないのでは? もし「Data.txt」が存在しないなら、 > if((fp = fopen("Data.txt", "r")) == NULL) { の「fopen」は当然失敗しますよね
bldtemporal

2021/12/05 07:43

jbpb0 様 早速のご検討有難うございます。 失礼しました。投稿欄に記載するとき書き落としてしまいました。全部Data1としています。
jbpb0

2021/12/05 07:59 編集

> 投稿欄に記載するとき書き落としてしまいました。 本当に実行してるコードからコピペしたら、「書き落とし」は発生しません 今後はそうしてください また、この質問を編集して、実際に実行してるコードを掲載してください
guest

回答2

0

ベストアンサー

Data1.txt

text

10.03,0.1,50,2e-6

C

1#include <stdio.h> // fopen, fclose, printf 2 3int main(void) 4{ 5 FILE *fp = fopen("Data1.txt", "r"); 6 if (fp == NULL) { 7 printf(" Data1.txt: file open failure !!\n"); 8 return 1; 9 } 10 double a, b, dT; 11 int I; 12 fscanf(fp, "%lf,%lf,%d,%lf", &a, &b, &I, &dT); 13 fclose(fp); 14 printf(" Data1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a,b,I,dT); 15 return 0; 16}

C++

1#include <fstream> // ifstream 2#include <cstdio> // printf 3 4int main() 5{ 6 std::ifstream ifs("Data1.txt"); 7 if (!ifs) { 8 std::printf(" Data1.txt: file open failure !!\n"); 9 return 1; 10 } 11 double a, b, dT; 12 int I; 13 char c; // ',' を読み込む 14 ifs >> a >> c >> b >> c >> I >> c >> dT; 15 std::printf(" Data1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a, b, I, dT); 16 return 0; 17}

投稿2021/12/05 08:46

kazuma-s

総合スコア8224

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

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

bldtemporal

2021/12/06 08:25

kazuma -s 様 ご懇切な回答有難うございます。 実は実行できなかった原因は、➀データファイルの置き場所を間違えていたこと、②ヘッダーファイルが適切でなかったことでした。 ➀により当然読込み不良となります。また②により実行不能データが全部ゴミ化してしまっていました。 これらの改善により、scanf()は成功し、600行ほどのtest Prgについて計算実行もできましたので、本件は解決です。ご教示頂いていますifstream ifs()でデータを読み込む方法ですが、本で勉強したのですが、各変数を取り込む方法がどうしても分かりませんでした。対象のPrgはC言語で完成している大きなPrgでありますので、C++共通化できればBestと考えました。しかしながら、CからC++への共通化についての記載は発見できず諦めていましたが、上記➀②に気が付き解決に至ったと言うところです。ご教示頂いたifstreamを使う方法はc++の標準と思いますので、今後のため実行してみます。
bldtemporal

2021/12/06 11:21

kazuma-s 様 お教え頂いた下記の方法で実行できることを確認しました。有難うございました。ところで、データの特定ですが、 ifs >> a >> c >> b >> c >> I >> c >> dT; が入力順(a,b,I,dT)に並んでいるので、それぞれが特定されるということなのですね、この点が自学では分かりませんでした。一方、fscanf()では、 fscanf("%lf,%lf,%d,%le\n", a.b.I,dT)では入力時にa,b,I,dTが特定されるので分かり易かったです。 #include <fstream> // ifstream #include <cstdio> // printf using namespace std; int main() { // std::ifstream ifs("Data1.txt"); ifstream ifs("Data1.txt"); //--using namespace ni yoru if (!ifs) { // std::printf(" Data1.txt: file open failure !!\n"); printf(" Data1.txt: file open failure !!\n"); //--using namespace return 1; } double a, b, dT; int I; char c; // ',' を読み込む ifs >> a >> c >> b >> c >> I >> c >> dT; //--- std::printf("\n Data1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a, b, I, dT); printf("\n Data1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a, b, I, dT); //---using namespace ni yoru return 0; }
guest

0

思ったままにパラパラと書かないで、例えば
「回答者が書いてある順に作業すれば追試ができる」
ように書いていただけませんか。もちろん、プログラムも可能な限り略さずに、長いなら不要な部分は削ってもいいですが、それでも「症状は出るけど動く」ように。

fp=fopen("Data1.txt", "r"); if((fp = fopen("Data.txt", "r")) == NULL) {

変数fpを使いまわしているのですか?

とにかく、ファイルのオープンで失敗しているのですから、fscanfは関係ありません。
データファイルがちゃんとプログラムの認識できる場所にあるか確認してみてください。

投稿2021/12/05 03:58

thkana

総合スコア7703

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

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

bldtemporal

2021/12/05 06:13

thkana 様 アドバイス有難うございます。 その通りです。いろいろ試して、”Data1 file open failure”と出たのを載せてしまいました。お許し下さい。 それで、実プログラム約10000行あり、ここに全部記載できませんが、引っ掛かっている最初の部分を述べます。 ここが解決しないと先に進めない、と言うところです。 a=0.03, B=0.1,I=50,dT=2e-6 を、0.03,0.1,50,2e-6として、Data1.txtと名付けて保存し、 int main(){ FILE *fp; fp=fopen("Data1.txt", "r"); if((fp = fopen("Data.txt", "r")) == NULL) { printf("\n Data1 file open failure !!\n"); } double a,b,dT; int I1,I2; fscanf(fp, "%lf,%lf,%d,%le", &a,&b,&I,&dT); printf("\nData1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a,b,I,dT); //--confirm input data return 0; } これで計算は進んでいるのですが、"Data1 file open failure"と表示されるので結果は無茶苦茶です。 従って、次のように修正して試してみてもいます。 int main(){ ifstream ifs("ModDta.txt"); double a,b,dT; int I1,I2; fscanf(FILE*, "%fl,%lf,%d,%le", &a,&b,&I,&dT); printf("\nData1: a=%7.4f, b=%6.3f, I=%d, dT=%4.1e\n", a,b,I,dT);         //--confirm input data retuun 0; } これですと、"Data1 file open failure"は出ませんが、fscanfのところのFILEの後の”*,”について エラーメッセージが表示されます。a,b,I,dTを読み込ませるための方法がありますでしょか、
thkana

2021/12/05 06:19

エラーが出るとか出ないとか置いといて、純粋にコードを眺めた時に fp=fopen("Data1.txt", "r"); if((fp = fopen("Data.txt", "r")) == NULL) { これがとても異常なことだ、というのはわかりますか? (これは多分エラーとは直接には関係ないですが)
thkana

2021/12/05 06:27

> 次のように修正して それは、「修正」なのですか? とても厳しい言い方になってしまいますが、C/C++のプログラムであることを無視して、ただ聞いたことのある単語をそれっぽく並べたもの、に見えます。 そのやり方で10000行のプログラムを完全な動作に持っていくには多分10000年かかります。(長いプログラムはそれぞれの部分の組み合わせで爆発しますから)
kazuma-s

2021/12/05 08:31

int I1,I2; fscanf(fp, "%lf,%lf,%d,%le", &a,&b,&I,&dT); I1 と I2 を宣言して、宣言なしの I に入力データを読み込むつもりですか? fp=fopen("Data1.txt", "r"); if((fp = fopen("Data.txt", "r")) == NULL) { printf("\n Data1 file open failure !!\n"); } オープンしたいのは、Data1.txt ですか、それとも Data.txt ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問