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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

Q&A

1回答

1085閲覧

C++ CSVファイル読み込みと構造体、ポインタ渡し

YK_onigiri00

総合スコア0

CSV

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

0グッド

0クリップ

投稿2023/07/06 09:34

前提

C++を学校で学んでいます。以下のコードが理解できず行き詰っています。

該当のソースコード

#include <iostream> #include <fstream> #include <sstream> using namespace std; typedef struct student{ string name; string id; double gpa; struct student* next; }Student; int main(){ ifstream ifs("data3.csv"); string line; stringstream stream; Student *top = NULL; Student *sp; while(getline(ifs, line)){ sp = new Student; sp->next = top; top = sp; stream.clear(); stream << line; getline(stream,sp->name,','); getline(stream,sp->id,','); stream >> sp->gpa; } sp = top; while(sp != NULL){ cout << sp->name << "," << sp->id <<"," << sp->gpa << endl; sp = sp->next; } ifs.close(); }

data3.csv

まるた まるお,00k0000,3.25
かくた かくこ,00k0001,2.84
てんだ てんこ,00k0002,3.01

一個目のwhile文が何をどうしているのか理解ができません。
特にtop = sp; はなぜいるのでしょうか

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

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

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

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

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

setoppu

2023/07/06 11:04

変数名がtopなんだったら、リスト構造の先頭を指すべきでしょうね。 1つ前の要素を指す。と、更新していっているので、 データ入れ終わった時に先頭が行方不明になります。 単方向リストなので先頭まで戻れない。 top:先頭の要素へのポインタ sp:追加する要素を保持するインスタンス となりますが…まぁよろしくない例なんでしょうな。 sp->next = new Student; sp = sp->next; が妥当じゃないですかねぇ。 spを変更する前に、topがnullだったら保存しておく必要はありますが。 素直にstd::list使うべきじゃないですかね。
fana

2023/07/07 04:18

回答を書きましたが,新規要素はリストの末尾ではなく先頭に追加していく形だと思いますよ. topは常に先頭を指しています. spの方は繋ぎ変え作業中にのみ必要なだけの存在ですね. 例えば,仮に Student に next メンバを初期化するための引数を持つコンストラクタがあるとしたら top = new Student(top); みたいな話で,spは要らない.
winterboum

2023/07/07 08:14

変数名 top がイマイチで混乱させてますね。 トップ ではなく sp が StudentPoint なのの類推からすると ToPoint のつもりだったのかな。。。 sp->next = top だと、トップではなく テイル になるように思えるのだが。 sp->prev = top とすれば トップはトップになるが。そこで top ではなく prevp と命名しておけば、順繰り感が入るかなぁ。 top だと トップ の感強く、それだと 順繰りではなく 端の一点という感。
winterboum

2023/07/07 08:17

while(getline(ifs, line)) は ifs から 1行 lineへ読み込んで、それが成功している間繰り返す という意味です。 これってキホンのキ ですよ
fana

2023/07/07 09:11 編集

? リストの先頭要素を指す用のものを "top" と名付けていることにそんな違和感あるかな? ("sp" の方は「すごいポインタ」あたりを推す) 順序的にスタック的なことをしようとしているから "top" とかいう名前なのかもしれぬ. そうすると "sp" は「スタックポインタ」あたりから来ているのだろうか? でもそんな話なら "top" の方を "sp" と命名すべきような気がしないでもないが…まぁどうでもいい.
winterboum

2023/07/07 12:02 編集

先頭のものをtopとするのは全く違和感ないですが、 top = sp; の時点で先頭じゃなくなってますよね、 それに sp->next = top; ということは、 sp の次が top ということでこれは sp が先頭になってない? CSVに 生徒1、生徒2、生徒3 とならんでたとき、先頭は生徒1 だと言うのが自然ですが(よね?) このプログラムの処理の結果、 生徒3-> next ⇒ 生徒2->next ⇒ 生徒1 というListになります。このデータだと 生徒3が先頭では? これが完成した時点では top は 生徒2で、どちらから見ても先頭とは言えない
winterboum

2023/07/07 12:01

StudrntPointa だとおもってました。
guest

回答1

0

なにがどうなっているのかを把握するためには,
これ系の(ポインタ絡みの)話によくある絵を描いてみればよいのでは.

まず初期状態.
while ループに入る前の初期状態では top は NULL です.
sp の方は未初期化なので値不定です.

[top] ----> (NULL) [sp] ----> (不明)

さて,while ループ内での

C++

1sp = new Student; //新しい Student オブジェクトを生成し,spがそいつを指すようにする 2sp->next = top; //spが指すオブジェクトのnextが,現在のtopと同じものを指すようにする 3top = sp; //topを,spと同じものを指すように変更する

の結果,どうなるのか?

[sp],[top] ----> Strudent1号 :(next)---> NULL(元top)

という感じになるでしょう.
sp, top の両者は new で生成された Student オブジェクトを指しており,そのオブジェクトの next メンバは NULL(これは top の初期値) です.
(……っていうのを頑張って絵で示したものだと思って見てください.実際には紙上でもっといい感じに描いてください.)

では,ループして再度上記の3行を実施したらどうなるのか?

[sp],[top] ----> Strudent2号 :(next)---> Student1号:(next)---> NULL

となりそうです.
sp, top の両者は新しいオブジェクトを指し,その新しいオブジェクトの next メンバは直前の top が指していたものを指し示す,という話なので.

さらにループすれば同様に

[sp],[top] ----> Strudent3号 :(next)---> Strudent2号 :(next)---> Student1号:(next)---> NULL

となるでしょう.


要はリストの先頭側にオブジェクトを追加していっている.なので,

特にtop = sp; はなぜいるのでしょうか

は,「top がリストの先頭要素を指すようにするため」ですかね.

投稿2023/07/07 04:08

編集2023/07/07 04:21
fana

総合スコア12151

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問