2011-10-31 22 views
0

を何をするか分からない:(。各フォーマットで同じことを見て、ラインの未知の量があるであろう)構造体のベクタと私はテキストの各行について

-Get first name 
-Get last name 
-Get Student Number 


フォーマット:

First Last 111111111 
First Last 111111112 
... 

私はそれぞれの生徒のそれぞれを独自の構造にしたいと思っています。次のように私は、構造体を設定している次のように

struct Student{ 
    string lastName; 
    string firstName; 
    string stdNumber; 
    double assgn1;//doubles will be used later in prog. 
    double assign2; 
    double assign3; 
    double assign4; 
    double midTerm; 
    double finalGrade; 
}; 

マイファイル入力機能がある:ファイル入力で

int getFileInfo() 
{  
    int failed=0; 
    ifstream fin; 
    string fileName;  
    vector<Student> students; 

    Student s;     // A place to store data of one student 
    cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl; 
    do{         
     if(failed>=1)       
      cout<<"Please enter a correct filename."<<endl; 
     cin>>fileName;        
     fin.open(fileName.c_str());// Open the file  
     failed++;           
    }while(!fin.good());           
    while (fin >> s.firstName >> s.lastName >> s.stdNumber) 
     students.push_back(s);      
    fin.close();        
    return 0;         
} 

、私はベクトルを作るが、私はアクセスする方法がわかりませんよそれぞれの個々の部分、または学生、s、それは1人の学生を作るように見えるので。私はファイルの各行が分割されてstudentsベクトルに入力されたと言われましたが、その情報の抽出方法はわかりません。それぞれの学生をstudentsベクトルとそれ自身の構造体からどのようにして得るのですか?各学生をそれ自身の構造体として使うことができますか? だから最後に、私が出力できるようにしたいです。助けを事前に

Student1: First Last 111111111 
Student2: First Last 111111112 
However More students are in the file 

感謝!!

@Loki ループをloop != endに変更しましたが、同じ問題が発生しました。ここに私のコードです:再び

int getFileInfo() 
{ 
int failed=0; 
ifstream fin; 
string fileName; 
vector<Student> students;// A place to store the list of students 
vector<Student>::iterator loop = students.begin(); 
    vector<Student>::iterator end = students.end(); 

Student s;     // A place to store data of one student 
cout<<"Please enter the filename of the student grades (ex. filename_1.txt)."<<endl; 
do{ 
if(failed>=1) 
    cout<<"Please enter a correct filename."<<endl; 
    cin>>fileName; 
    fin.open(fileName.c_str());// Open the file 
    failed++; 
}while(!fin.good()); 

while (fin >> s.firstName >> s.lastName >> s.stdNumber){ 
    cout<<"Reading "<<s.firstName<<" "<<s.lastName<<" "<<s.stdNumber<<endl; 
    students.push_back(s); 
} 
fin.close(); 

    for(loop;loop!=end;++loop) 
    cout<<loop->firstName<<" "<<loop->lastName<<" "<<loop->stdNumber<<endl; 

return 0; 
} 

、Visual Studioは
が指差す、vector iterators incompatibleを言っているに "C:\プログラムファイル(x86の)は、MicrosoftのVisual Studio \ 10.0 \ VCの\は\含まベクトル"

+0

[はifstream ::読みを()]を読んfancy.Justナッシング(http://www.cplusplus.com/reference/iostream/ istream/read /)をファイルから取り出し、[vector :: push_back](http://www.cplusplus.com/reference/stl/vector/push_back/)を使用してベクトルに保存します。 –

+0

私は既にデータファイルをテキストファイルからベクトルに取り除いています。私は問題を抱えている構造体のベクトルから保存されたデータを取得しています。 – b3orion

+0

私はあなたに役立つ希望の答えを追加しました。 –

答えて

1

、私はベクトルを作るが、私はそれの個々の部分にアクセスする方法がわからないと思います。

あなたは0からインデックスを使用することができる[]

students[0].firstName; // get the first name. 

std::cout << students[1].firstName; // prints out the first name. 

オペレータを介して個々の要素にアクセスすることができる - >サイズ()。

size_t size = students.size(); // number of students in the vector. 

students[size].firstName; // This is wrong. You expression in 
          // [] must be less than size as the elements are 
          // numbered from 0 to size() -1. 

唯一の学生になると思われるので。

あなたは1人の生徒を作成しています(より良い名前を選ぶことはできません)。しかし、push_back()を呼び出すと、この生徒オブジェクトがベクトルにコピーされます。だからベクトルはそれが格納する 's'のコピーを得る。そしてループのたびに、 's'の古い値をファイルから取り出された新しい値で上書きします。

私は、ファイルの各行が分割され、生徒ベクトルに入力されたと言われましたが、その情報の抽出方法はわかりません。

各素子上述したように、オペレータ[]

別の方法としては、範囲を取得するイテレータを使用することができるを用いて個々に到達することができます。学生の

std::vector<Student>::iterator loop = students.begin(); 
std::vector<Student>::iterator end = students.end(); 

ループを逆参照して要素にアクセスし、ループを増やして次の生徒に移動できます。

std::cout << loop->firstName; // prints out student[0] 
++loop;       // Increment loop now it points at student 1 
std::cout << loop->firstName; // prints out student[1] 
++loop;       // Increment loop now it points at student 2 
// etc 

ループが終了すると、すべての生徒を通過しました。

どのように私は生徒のベクトルとそれ自身の構造体から各生徒を得ることができますか?私は各生徒をそれ自身の構造体として使うことができますか?

生徒はすでに構造体に入っています。あなたは外部の構造体と同じようにそれらを直接使うことができます。あなたがそれらをコピーしたい場合しかし、あなたはこれを行うことができます。

Student tmp = students[0]; // copies student 0 into tmp. 

私が出力できるようにしたいでしょう:標準出力に出力のものに

使用のstd :: coutを。またはタイプSTDのオブジェクトを作成する::ファイルに出力するofstreamの:

std::cout << tmp.lastName << " " 
      << tmp.firstName << " " 
      << tmp.stdNumber << "\n"; 

std::ofstream file("plop1.txt"); 
file  << tmp.lastName << " " 
      << tmp.firstName << " " 
      << tmp.stdNumber << "\n"; 
+0

出力しようとすると'std :: cout'を使って' Debug Assertion Failed! 'というポップアップウィンドウを表示しました。 '' Expression:ベクトル反復子は参照不可能です。' '任意のアイデアはどういう意味ですか?私は、逆参照不可能なもので逆参照ループにある問題を見ることができました... – b3orion

+0

(end()によって返されたイテレータによって示されるように)最後に渡されたイテレータを参照および参照解除しましたか? –

+0

私はforループを作った: 'for(loop; loop == end; ++ loop)'これは、 'vector iterators incompatible'です。説明できますか? – b3orion

2

Online Demo Sample:ファイル入力で

#include<iostream>  
#include<string> 
#include<vector> 

using namespace std; 

struct Student 
{ 
    string lastName; 
    string firstName; 
    string stdNumber; 
    double assgn1;//doubles will be used later in prog. 
    double assign2; 
    double assign3; 
    double assign4; 
    double midTerm; 
    double finalGrade; 
}; 

int main() 
{ 
    Student obj; 
    obj.firstName = "ABC"; 
    obj.lastName = "XYZ"; 

    vector<Student> students; 
    students.push_back(obj); 
    vector<Student>::iterator it; 

    cout << "students contains:"; 
    for (it=students.begin() ; it != students.end(); ++it) 
    { 
     cout << " " << (*it).firstName; 
     cout << " " << (*it).lastName; 
     //And so on... 
    } 

     return 0; 
} 
+1

'それ Nawaz

+0

@Nawaz:まあ、見つかった。私は編集中だったが、指摘してくれてありがとう。 –

+0

+1今すぐ.......... – Nawaz

関連する問題