2009-08-05 13 views
0

Ich habe eine Beispieltxt-Datei und möchte den Inhalt der Datei in ein Array von Strukturen lesen. Meine persons.txt-Datei enthält 5 beliebige Nos eins in jeder Zeile.Lesen von Daten aus Datei in Array von Strukturen C++

7 
6 
4 
3 
2 

Mein Programm sieht wie folgt aus:

#include <iostream> 
#include <fstream> 

using namespace std; 

struct PersonId 
{ 
    typedef PersonId* ptr; 
    PersonId(); 
    int fId; 
}; 

istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p; 
    // return is; 
    // return p.read(is); 
} 

// istream& PersonData::read(std::istream& is) 
// { 
// is >> fId; 
// return is; 
// } 


int main() 
{ 
    ifstream indata; 
    int i, is; 
    indata.open("persons.txt", ios::in); // opens the file 

    if(!indata) 
    { // file couldn't be opened 
      cout << "Error: file could not be opened" << endl; 
      exit(1); 
    } 

    int n = 5; 
    PersonId* p; 
    p = (PersonId*) malloc (n * sizeof(PersonId)); 

    while (!indata.eof()) 
    { // keep reading until end-of-file 
     // p[i].read(); 
     indata >> is; 
     i++; 
     cout << "The next number is "<< is << endl; 
      cout << "PersonId [" << i << "] is " << p[i].fId << endl; 
     // indata >> is; // sets EOF flag if no value found 
    } 
    return 0; 
} 

Meine Ausgabe wie folgt aussieht:

test6.cpp: In function ‘std::istream& operator>>(std::istream&, PersonId&)’: 
test6.cpp:27: warning: control reaches end of non-void function 
The next number is 7 
PersonId [1] is 0 
The next number is 6 
PersonId [2] is 0 
The next number is 4 
PersonId [3] is 0 
The next number is 3 
PersonId [4] is 0 
The next number is 2 
PersonId [5] is 0 
+1

Und Ihre Frage ? BTW Ihr Code ist sehr fehlerhaft. –

+0

Umzug von C nach C++ nach einer langen Zeit :) – vivekv80

Antwort

2
istream& operator >> (istream& is, PersonId &p) 
{ 
    is >> p.fId; 
    return is; 
} 

(Lesen der Mitglied fid von p, nicht die gesamte Struktur)

Und die while in main, r ead die Struktur, die kein Wert:

statt

indata >> is; 

setzen

indata >> p[i]; 
+0

Initialisieren Sie auch ich auf Null vor der While-Schleife und bewegen Sie i ++ NACH Ihrem Cout. – ScottTx

+0

struct PersonId { \t int fId; }; struct Personen { \t public: \t \t typedef Personen * Ptr; \t \t PersonData(); \t \t PersonId fId; \t \t iStream & lesen (Std :: iStream &); }; iStream & PersonData :: lesen (std :: iStream & ist) { \t ist >> fId; \t Rückkehr ist; } istream & operator >> (istream & ist, PersonData & p) { \t // ist >> p.fId; \t Rückgabe p.read (is); } Wie funktioniert indata >> p [i] in diesem Szenario? – vivekv80

0

See Neil Butter Antwort auf ifstream object.eof() not working, wie von einem istream richtig gelesen zu

+0

Ich vermied es, getline() bcos in der Zukunft zu verwenden Ich werde viele Zahlen in einer Zeile haben, die die Elemente der gleichen Struktur sein werden. – vivekv80

+0

Getcha, aber ich war mehr besorgt über Ihre Verwendung von eof(). – tragomaskhalos