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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

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

Q&A

解決済

2回答

655閲覧

C++ CSVを読み込んで最大値の項目を表示したい

darima

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

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

0グッド

0クリップ

投稿2022/05/11 20:19

実現したいこと

CSVファイルを読み込んで最大値の項目名を表示したい。
例として現在の実行結果の pattern[0]>0.100000, を パターンA >0.100000, と表示したり、
最も高いパターンはpattern[3]で,0.900000です。を 最も高いパターンはパターンDで,0.900000です。
と表示できるようにしたいのですが、どうすればいいかわかりません。

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

配列名を結果に表示してしまっている。

CSVファイルの中身

CSV

1パターンA,パターンB,パターンC,パターンD,パターンE,パターンF 20.1,0.3,0.4,0.9,0.2,0.5 3

該当のソースコード

C++

1ソースコード 2 3#pragma warning(disable: 4996) 4#include <stdio.h> 5#include <string.h> 6 7int main(void) 8{ 9 double pattern[6] = { 0 }; 10 double max_pattern = 0; 11 int number = 0; 12 char temp[1024]; 13 14 // CSVファイル(data.csv)を開く 15 FILE* fp = fopen("./data.csv", "r"); 16 if (!fp) { 17 printf("ファイルが開けません。\n"); 18 } 19 fgets(temp, 1024, fp); 20 fscanf_s(fp, "%lf,%lf,%lf,%lf,%lf,%lf", 21 &pattern[0], &pattern[1], &pattern[2], &pattern[3], &pattern[4], &pattern[5]); 22 23 for (int i = 0; i < 6; i++) { 24 if (pattern[i] > max_pattern) { 25 max_pattern = pattern[i]; 26 number = i; 27 } 28 else {} 29 printf("pattern[%d]>%f, ", i, pattern[i]); 30 } 31 printf("\n最も高いパターンはpattern[%d]で,%fです。\n", number, max_pattern); 32 fclose(fp); 33 34 return(0); 35}

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

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

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

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

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

guest

回答2

0

ベストアンサー

C

1#pragma warning(disable: 4996) 2#include <stdio.h> 3#include <string.h> 4 5int main(void) 6{ 7 double pattern[6] = { 0 }; 8 double max_pattern = 0; 9 int number = 0; 10 char temp[1024]; 11 12 // CSVファイル(data.csv)を開く 13 FILE* fp = fopen("./data.csv", "r"); 14 if (!fp) { 15 printf("ファイルが開けません。\n"); 16 } 17 fgets(temp, 1024, fp); 18// 追加 ここから 19 char* header[6]; 20 int i = 0; 21 for ( char* token = strtok(temp, ",\n"); token; token = strtok(nullptr, ",\n") ) { 22 header[i++] = token; 23 } 24// 追加 ここまで 25 fscanf_s(fp, "%lf,%lf,%lf,%lf,%lf,%lf", 26 &pattern[0], &pattern[1], &pattern[2], &pattern[3], &pattern[4], &pattern[5]); 27 28 for (int i = 0; i < 6; i++) { 29 if (pattern[i] > max_pattern) { 30 max_pattern = pattern[i]; 31 number = i; 32 } 33 else {} 34 printf("pattern[%d]>%f, ", i, pattern[i]); 35 } 36 printf("\n最も高いパターンは%sで,%fです。\n", header[number], max_pattern); 37 fclose(fp); 38 39 return(0); 40}

投稿2022/05/12 02:37

episteme

総合スコア16614

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

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

0

fgets(temp, 1024, fp);

ここでデータの1行目を読んでいるので、temp, で分割して std::vector<std::string> にでも入れたら後からインデックスでパターン* を参照することができます。

投稿2022/05/12 00:46

int32_t

総合スコア20884

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

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

darima

2022/05/12 02:17

ありがとうございます。 初歩的な質問でしたらすみません。std::vectorをあまり扱ったことがなく、自分で調べたりしてみたのですが、tempを,で分割 というのがよくわかりませんでした。もう少しご教授して下さると幸いです。申し訳ありません。
int32_t

2022/05/12 02:23

C的にやるなら「strtok」、C++的にやるなら「c++ string split」で検索してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問