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

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

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

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

Q&A

解決済

2回答

1937閲覧

C++にてテキストファイルを構造体へと読み込ませる

sekiguchi.m

総合スコア15

C++

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

0グッド

0クリップ

投稿2019/06/15 16:54

編集2019/06/16 05:00

前提・実現したいこと

C++(Visual Studio2019)テキストファイルを読み込み、それを構造体に
読み込みコンソールに表示する、というプログラムを作成したいです。

https://edu.clipper.co.jp/pg-2-30.html
ここのCのソースコードをC++で書きたいです。

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

fopenをfopen_sに、
scanfをscanf_sに直せと警告が出たため直したのですがコンパイルエラー
を吐きます。
ror = fopen_s(&fp, "stars.txt", "r"); より後のfpが0である可能性があります。関数"~"の
指定に従っていません。という警告が出ます。

エラーメッセージ fpが0である可能性があります。関数"~"の 指定に従っていません。という警告が出ます。

該当のソースコード

C++ #include <iostream> #include <cstdio> #include <cstdlib> #define MAXCNT 10 typedef struct { char name[16]; float height; float weight; }shape_t; int main() { int a, i, mt; FILE* fp; errno_t error; shape_t stars[MAXCNT]; // 構造体配列の宣言 error = fopen_s(&fp, "stars.txt", "r"); if (error != 0) printf("ファイルがオープンできません\n"); while ((a = fgetc(fp)) != EOF) putchar(a); fclose(fp); for (i = 0; i < MAXCNT; i++) { if (fscanf_s(fp, "%s %f %f\n" // 構造体配列への読み込み , stars[i].name, &stars[i].height, &stars[i].weight) != 3) break; } fclose(fp); // 本来なら、入力したデータを関数などに渡して使います // たとえば一番背の高い人を調べる関数 // int whoIsTallest( shape_t stars[], int num ) など // 関数との受け渡しは次回のTipsで ... mt = 3; // ここでは3が返されたことにします printf("The tallest is %s(%.1fcm)\n", stars[mt].name, stars[mt].height); }

試したこと

fclose(fp)とerror
を随所に入れてみましたが駄目でした。かれこれ4日ほど悩んでおります。

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

初投稿です。C++を始めて一週間の初心者です。どうぞお力添えくださいますようお願い申し上げます。

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

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

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

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

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

otn

2019/06/15 17:53 編集

コードは、 ```C++ と ``` の行で囲んで下さい。
guest

回答2

0

こんにちは。

そのままで動きますよ

fopenをfopen_sに、scanfをscanf_sに直せと警告が出たため直した

そのように修正する場合は、名前を変更しただけではダメです。パラメータの数や並びが異なる筈ですのでそれぞれの関数の仕様を確認しましょう。fopen_sscanf_s

もしくは、何かシンボルを定義するようにとか、#pragma指定をするように等のメッセージはでませんでしたか? でているなら、そのメッセージに従うのも手です。

しかし、これらはC++でも使えますがC言語の標準ライブラリです。
C言語の標準ライブラリは設計が古すぎてちゃんと使おうとすると鬱になります。(C言語の標準ライブラリは落とし穴の多さが憂鬱です。)
どうせ鬱になるなら設計が新しいC++の標準ライブラリへ乗り換えた方が良いと思いますよ。(C++は学習難易度の高さに憂鬱になる時もあります。)
C++の標準ライブラリ(STLと呼ばれます)を使う場合はepistemeさんの回答が参考になると思います。

投稿2019/06/15 20:01

編集2019/06/15 20:04
Chironian

総合スコア23272

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

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

sekiguchi.m

2019/06/16 05:19

何かシンボルを定義するようにとか、#pragma指定をするように等のメッセージは特にありませんでした。 C++の標準ライブラリは説明を読んでも難しく、敬遠しておりましたがこれを機に勉強したいと思います。 epistemeさんのご提示してくださったソースコードでうまく動作しました!ありがとうございました。
guest

0

ベストアンサー

参考にならない回答例:

C++

1#include <iostream> 2#include <fstream> 3#include <array> 4 5#define MAXCNT 10 6 7struct shape_t { // 構造体の宣言 8 char name[16]; 9 float height; 10 float weight; 11}; 12 13int main() { 14 using namespace std; 15 16 array<shape_t,MAXCNT> stars; // 構造体配列の宣言 17 18 ifstream stream("starsdata.txt"); 19 if( !stream.is_open() ) { 20 cout << "ファイルがオープンできません\n"; 21 exit( 1 ); 22 } 23 24 for ( int i = 0; i < MAXCNT; i++ ) { 25 if ( !(stream >> stars[i].name >> stars[i].height >> stars[i].weight) ) break; 26 } 27 28 // 本来なら、入力したデータを関数などに渡して使います 29 // たとえば一番背の高い人を調べる関数 30 // int whoIsTallest( shape_t stars[], int num ) など 31 // 関数との受け渡しは次回のTipsで ... 32 33 int mt = 3; // ここでは3が返されたことにします 34 cout << "The tallest is " << stars[mt].name << '(' << stars[mt].height << "cm)\n"; 35}

投稿2019/06/15 19:18

episteme

総合スコア16614

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

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

episteme

2019/06/16 05:23 編集

質問に答えていないのに、なんでこれがベストアンサーなんだよ!?
sekiguchi.m

2019/06/16 05:15

早速のご返答ありがとうございます。 やりたかったことができました!なんとお礼を申し上げればよいか…
episteme

2019/06/16 05:25

C++の方が簡単でしょ?
sekiguchi.m

2019/06/16 06:59

まだstreamが体に馴染んでおらず、難しいなぁという印象ですね… ところで貼ってくださったソースコードの if ( !(stream >> stars[i].name >> stars[i].height >> stars[i].weight) ) break;の if ( !(stream  ←ここは何を意味しているのでしょうか?調べてみたのですがよくわかりませんでした。
episteme

2019/06/16 10:02

if のナカミは「読みこみを行い、失敗したらtrueを返す式」です。
sekiguchi.m

2019/06/16 13:46

そうなのですね ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問