2016-08-03 69 views
0

私はC++でのプログラミングには新しく、練習問題をやろうとしていますが、それ以来私に何を得ようとしているのか分かりませんベクトルは1つのデータ型しか保持できません(それ以上のデータ型を保持できない場合)。.csvファイルを読み込み、ベクトルと構造体に値を格納するC++

各行が "username、gpa、age"のように構成されている.csvファイルを読み込みます。これらの値をusername、gpa、age(string、float、int)構造体に格納し、リストをベクトルとして作成します。各行を読むときに、ユーザー名でソートされたベクトルリストに挿入します。 "username [gpa] age:#"、 "mark [3.9] age:19"などの形式でリストを出力し、ファイルに出力します(UnixではなくC++を使用します)。

私はこれらの値を別々のデータ型と同じベクトルに入れたり、それらをすべてまとめて文字列に保持しておきます。これらの値を構造体に格納するにはどうすればよいですか?誰かが質問を解決する方法を教えてくれて、偉大なサンプルコードをくれたら、ありがとう。

+0

必要に応じて構造体のベクトルを作成できます。 – mash

+0

C++の構造体( 'struct')はクラス(' class')と変わりありません。どちらもメンバー変数を持つことができます。ファイルの読み込みに関しては、['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)関数は、ファイルからの読み込みと各行の解析の両方を助けることができます。 –

+0

この問題は、username、gpa、およびageのフィールドを持つ構造体を構築するように要求します。この構造体のベクトルが可能です。 – heLomaN

答えて

0

あなたがファイルを読んで、情報を構造体に入れてから、構造体を名前にしたがってアルファベット順にベクトルに挿入したいと思っています。

私のような構造体に何か作ると思います。私は、ファイルを開いて、文字列に全部を読んだ

struct StudentInfo { 
    string name; 
    string gpa; 
    string age; 
} StudentInfo; 

を。それから、文字列を改行文字でトークン化して読みました。各文字列を取得すると、それを解析してstudentInfo構造体を返す関数に入れます。構造体をベクトルに挿入します。

解析機能が働くかもしれない方法の例:

struct StudentInfo parseData(string iStr) { 
    struct StudentInfo info; 
    size_t subStrStart = 0; 
    size_t subStrEnd = 0; 
    subStrEnd = iStr.find(',', subStrEnd); 
    info.name = iStr.substr(subStrStart, subStrStart - subStrEnd); 

    subStrStart = subStrEnd; 
    subStrEnd = iStr.find(',', subStrEnd+1); 
    info.gpa = iStr.substr(subStrStart, subStrStart - subStrEnd); 

    subStrStart = subStrEnd; 
    subStrEnd = iStr.find(',', subStrEnd+1); 
    info.age = iStr.substr(subStrStart, subStrStart - subStrEnd); 

    return info; 
} 

は、主な機能のためのいくつかの擬似コードは、私が作ると思います:

vector<struct StudentInfo> infoVec; 
string fileStr = read(filename.csv); // make an ifstream or something similar 
string lineStr; 
size_t subStrEnd = 0; 
size_t subStrStart = 0; 
while (subStrEnd < fileStr.Size) { 
    subStrEnd = iStr.find('\n', subStrEnd); //alternatively use std::getline() directly on the file stream 
    lineStr = iStr.substr(subStrStart, subStrStart - subStrEnd); 
    subStrStart = subStrEnd; 
    subStrEnd++; 
    infoVec.insert(parseData(lineString)); 
} 
sortByName(infoVec) // User defined function 
printInfoVec(infoVec) // User defined function 

印刷機能とソート機能はかなり自明です彼らはあなたにそれらを書くように要求します。

+0

ありがとうございました!私はあなたが言っていることを完全に理解している、私はsubstrの使用についても考えなかった。 –

+0

心配する必要はありません。 – naffarn

関連する問題