2017-04-13 9 views
0

ファイルから配列を含むベクトルに文字列を格納しようとしています。以下は、ベクターに情報を得るための私の方法です:ファイルから値を入力したときに、ベクター印刷が空白になるのはなぜですか?

{ 
string line; 
int nooflines = 0; 
ifstream myFile("SongListFile.txt"); 
while (getline(myFile, line)) { 
    nooflines++; 
} 
song temp; 
    myFile.open("SongListFile.txt"); 
    for (int i = 0; i < nooflines; i++) { 
     myFile >> temp.title; 
     myFile >> temp.artist; 
     myFile >> temp.genre; 
     songs.push_back(temp); 
    } 
    myFile.close(); 
} 

そして、これはイムは、この情報に印刷しようとしている方法です:彼らは何も含まれていないかのように文字列が印刷されているのはなぜ

void SongList::ViewSongList() { 
    int last_element_position = songs.size() - 1; 
for (int i = last_element_position; i >= 0; i--) 
{ 
    cout << "\"" << songs[i].title << "\" by " << songs[i].artist << " (" << songs[i].genre << ")" << endl; 
} 

を? 2行のテキストがあるときに2つのテンプレートが印刷されるので、私の問題は配列に格納されていない文字列です。 }

+0

は、あなたのデバッガでこのコードを通じて段階と、それはあなたが何を考えていことを確認しましたします? – MrEricSir

+0

なぜ最初に行を数える必要がありますか?最初のループの 'songs'ベクトルを押すだけです。 – Barmar

+0

あなたが働いていたと思われる 'Song'のためのループされたストリームの読み込みもチェックすると、問題が明らかになります。 – WhozCraig

答えて

0

ファイル内の行数を何度も数える必要はありません。あなたは「再オープン」されている方法は、ファイルが正しくない、コメントや他の回答で示されているようにあなたは、1回のパスで読み取りを行うことができることを除け

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <string> 
using namespace std; 

struct Song { string title, artist, genre; }; 

int main() { 
    ifstream myFile; 
    myFile.open("songList.txt"); 

    string aLine; 
    vector<Song> songs; 
    while(getline(myFile, aLine)) { 
    stringstream sin(aLine); 
    Song aSong; 
    sin >> aSong.title >> aSong.artist >> aSong.genre; 
    songs.push_back(aSong); 
    } 

    for(int i = 0; i < songs.size(); i++) 
    cout << "\"" << songs[i].title << "\" by " << songs[i].artist << " (" 
    << songs[i].genre << ")" << endl; 
    return 0; 
} 
3

:あなたは1回のパスでそれを行うことができます。最初のパスの後、ifstreamのフラグがファイルの最後に達したときに設定されています。ファイルをもう一度開くと(閉じずに)フラグがクリアされません。

あなたが最初にを求める再度開く前myFile.close()のいずれかを必要とする、あるいはフラグをクリア:

myFile.clear();    // clear the flags 
myFile.seekg(0, ios::beg); // seek back to beginning for the second pass 
関連する問題