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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

3回答

6515閲覧

C++において構造体にcsvファイルから読み込んだ値を定義したい

muton

総合スコア31

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2019/05/15 10:16

編集2019/05/15 11:14

tCarCtrl構造体にcsvファイルから読み込んだ値(ary[0],ary[1])を定義したいと考えています。
以下の様にコードを考えたのですが, エラーが発生してしまっています。
対策についてどなたか教えていただけないでしょうか。
宜しくお願い致します。

開発環境
Windows8.1 Pro (64bit)
Excel 2016 (64bit)
Visual Studio 2017

対象とするコード

C++

1typedef struct { 2 FILE *file1; 3 char yy[256]; 4 char *ary[2]; 5 file1 = fopen("output.csv", "r") 6 /*ファイルの終わりまで繰り返し読み込む*/ 7 while (fgets(yy, 256, file1) != NULL) 8 { 9 printf("%s\n", yy); 10 ary[0] = strtok(yy, ","); 11 ary[1] = strtok(NULL, ","); 12 } 13 fclose(file1); 14 15} tCarCtrl;

発生しているエラーの例

while (fgets(yy, 256, file1) != NULL)  ⇒エラーC2059 構文エラー: '=' {  ⇒エラーC2334 '{' の前に予期しないトークンがありました。関数の本体は無視されます fclose(file1);   ⇒エラーC2061 構文エラー: 識別子 'file1'    エラーC4430 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません

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

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

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

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

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

cateye

2019/05/15 10:34 編集

fopen()のエラーチェックは?・・・そもそもメソッドでもないのに、実行文が有るのはなぜでしょう? また、構造体ではなくエラーになるソースを貼り付けて下さい。 エラーの出る行が間違っている可能性もありますが、そこまでのソースに誤りが有る場合もあります。
muton

2019/05/15 11:03

・fopenの行ではエラーが発生していません。 ・typedef structで実行分を行うこと自体が間違いなのでしょうか?tCarCtrl構造体にcsvファイルから読み込んだ値へのポインタを追加する必要があるのですが、その方法が全く分からなくて、上記のコードを書きました。 素人質問で申し訳ございません。ご教授頂けると非常に嬉しいです。 エラーコードに関しては追加します。
cateye

2019/05/15 12:02 編集

>fopenの行ではエラーが発生していません。・・・コンパイルエラーの事ですか? まぁ、コンストラクタはおいておいてw メソッドも何も定義しないでいきなりfopen()出来ると思いますか?そこに制御が渡ることはないですよ。
guest

回答3

0

ベストアンサー

C++らしく書いてみた。

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

コレ↑(output.csv) を コレ↓に食わすと

C++

1#include <iostream> // cout, endl 2#include <fstream> // ifstream 3#include <array> // array 4#include <string> // string 5#include <cstring> // strtok() 6#include <vector> // vector 7 8struct tCarCtrl { 9 std::array<std::string,2> ary; 10 11 tCarCtrl(const std::string& line) { 12 static char yy[256]; 13 strcpy(yy, line.c_str()); 14 ary[0] = strtok(yy, ","); 15 ary[1] = strtok(nullptr, ","); 16 } 17}; 18 19std::ostream& operator<<(std::ostream& stream, const tCarCtrl& car) { 20 return stream << '(' << car.ary[0] << ',' << car.ary[1] << ')'; 21} 22 23int main() { 24 using namespace std; 25 26 vector<tCarCtrl> cars; 27 { 28 ifstream file("output.csv"); 29 if ( !file.is_open() ) return 1; 30 31 string line; 32 while ( getline(file, line) ) { 33 cars.emplace_back(line); 34 } 35 } 36 37 for ( const auto& car : cars ) { 38 cout << car << endl; 39 } 40}

コレが出てくる。

(0, 1) (2, 3) (4, 5) (6, 7) (8, 9)

投稿2019/05/15 11:55

episteme

総合スコア16614

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

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

muton

2019/05/23 06:41

回答ありがとうございます。 参考にさせて頂き、コードを組んだ結果、csvファイルから読み込んだ値を定義できたため、ベストアンサーとさせて頂きます。
guest

0

char *ary[1];

と定義してるなら、

ary[1] = strtok(NULL, ",");

範囲オーバしてますぜ

んで、そもそもtypedef struct でするような内容ではないですな。
そこんとこどーにかしましょう

投稿2019/05/15 10:21

編集2019/05/15 10:24
y_waiwai

総合スコア87774

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

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

muton

2019/05/15 10:53

回答ありがとうございます。 typedef struct以外でこのコードを書いた場合、エラーも起きず、 csvファイルの一行目をary[0]と二行目をary[1]と定義できていた(printfで確認済)のですが、範囲オーバーしてしまっているのでしょうか。 別件(読み込んだ値をシュミレーション画面上に描画するため)でtCarCtrl構造体にcsvファイルから読み込んだ値を定義する必要があるのですが、typedef struct外で読み込んでtypedef struct内で定義すれば良いのでしょうか? 素人質問で申し訳ございません。ご教授頂けると非常に嬉しいです。
y_waiwai

2019/05/15 11:08

範囲オーバはコンパイル時にはエラー出ません ただ、まが悪ければ暴走するだけです typedef というのは型の再定義を行う命令です そーゆー使い方はできません
muton

2019/05/15 11:15

回答ありがとうございます。 tCarCtrl構造体にcsvファイルから読み込んだ値へのポインタを追加する必要があるのですが、それは可能なことなのでしょうか? 何度も申し訳ございません。宜しくお願い致します。
y_waiwai

2019/05/15 11:26

どんなポインタでも追加するのは可能です #それがなにを指しているのか、というのをしっかり把握しておきましょう
guest

0

こんにちは。

C++は構造体の中に関数を定義することはできますが、関数定義でない実行文を直接書くことはできないですよ。きちんと関数を定義しましょう。(定義方法は基礎ですので一度ご自身で調べてみて下さい。)

また、char *ary[1];は要素数が 1個 の配列を定義しています。2個必要なら、char *ary[2];と定義しましょう。

それと蛇足かもしれませんが、typedef struct {・・・} XXXX; は古い構文です。C++でこの形式の記述はあまり見かけません。struct XXXX {・・・};形式で記述することがほとんどです。

投稿2019/05/15 11:04

Chironian

総合スコア23272

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

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

muton

2019/05/15 11:12

回答ありがとうございます. ・不勉強で申し訳ございません。定義方法について調べてみます。 ・char *ary[1]→char *ary[2]の様に変更します。 ・研究で扱うオープンソースのカーシュミレーションのコードをいじっているという現状なのですが、古い構文が混じってしまっているのかも知れません。
muton

2019/05/15 11:15 編集

別件(読み込んだ値をカーシュミレーション画面上に描画するため)でtCarCtrl構造体にcsvファイルから読み込んだ値へのポインタを追加する必要があるのですが、それは可能なことなのでしょうか? 素人質問で申し訳ございません。宜しくお願い致します。
Chironian

2019/05/15 11:28

> それは可能なことなのでしょうか? 問題提議があいまいなので良く分からないですが、C++はC言語としても使えますので、恐らく可能です。 そのデータやポインタは可変個存在すると思いますが、それぞれの記憶領域をどのようにして確保するのか?などいくつかの課題があります。(std::vectorやstd::list等が検討対象になると思います。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問