2016-08-04 23 views
0

Ich versuche, eine TXT-Datei in ein Array von struct in diesem Programm zu lesen und den Inhalt anzuzeigen.
Die Datei sieht wie folgt aus:Datei in Array von struct C++ lesen

Smith Jack 60 45 98 
Harry Hisk 45 40 78 
Kay  Jacob 35.5 23 45 
Dos  hed 23 20 35 
Noa  Tom 55 12 32 
Joe  Peni 57 49 78 
Vin  San 25.6 23 65.5 
Jes  Dan 24.3 12 78 
Zi  Lee 56 49 99 
Angi  Dev 57 48 97 
Donald David 60 50 96 
Davis Lal 47 47 80 
Alvis Sen  56 46 85 
Jack Jill 45 45 75 
Messy Lionel 60 49 100 

Der Code Ich bin mit:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 
int main(){ 
    const int SIZE=50; 
    int i; 
    struct Records { 
     string firstname; 
     string secondname; 
     float test1mark; 
     float midtestmark; 
     float annualmark; 
    }record[SIZE]; 

    ifstream in("Data.txt"); 

    if (!in){ 
    cerr << "File can't be opened! " << endl; 
    system("PAUSE"); 
    exit(1); 
    } 
    for (int i=0; i < SIZE; i++){ 
    in >> record[i].firstname >> record[i].secondname 
    >>record[i].test1mark >> record[i].midtestmark >> record[i].annualmark ; 
    } 
    for (int i=0;i< SIZE;i++) { 
     cout << record[i].firstname<<" "; 
     cout << record[i].secondname<<" "; 
     cout << record[i].test1mark<<" "; 
     cout << record[i].midtestmark << " "; 
     cout << record[i].annualmark << " "; 
    } 
return 0; 
} 

Der Ausgang Ich erhalte:

Smith Jack 60  45  98 
Harry Hisk 45  40  78 
Kay  Jacob 35.5 23  45 
Dos  hed  23  20  35  
Noa  Tom  55  12  32 
Joe  Peni 57  49  78 
Vin  San  25.6 23  65.5 
Jes  Dan  24.3 12  78 
Zi  Lee  56  49  99 
Angi Dev  57  48  97 
Donald David 60  50  96 
Davis Lal  47  47  80 
Alvis Sen  56  46  85 
Jack Jill 45  45  75 
Messy Lionel 60  49  100 
       nan  0  8.94237e-039 
       4.36192e-039 0  -2.3511e-038 
       0  0  -2.3511e-038 
       0  0  0 
       1.32253e-038 0  1.32251e-038 
       4.2039e-045  0  -2.11122e+037 
       1.32251e-038 0  3.21276e-039 
       1.4013e-045  0  -2.3511e-038 
       1.4013e-045  0  3.76158e-037 
       0  0  3.76158e-037 
       0  0  1.12104e-044 
       4.36195e-039 0  4.36194e-039 
       3.57331e-043 0  6.0615e-039 
       0  0  3.21276e-039 
       4.2039e-045  0  6.41272e-039 
       1.12104e-044 0  6.63812e-039 
       4.36205e-039 0  -2.75237e+038 
       0  0  6.59812e-039 
       6.63426e-039 0  1.4013e-045 
       0  0  6.47961e-039 
       3.21319e-039 0  3.21319e-039 
       6.59812e-039 0  3.21299e-039 
       8.40779e-045 2.24208e-044 6.01433e-039 
       6.6045e-039  0  2.54408e-029 
       0  0  6.6045e-039 
       0  0  6.43946e-039 
       5.88656e-039 0  -4.12495e+011 
       0  0  0 
       5.88656e-039 0  2.54408e-029 
       nan  nan  6.43029e-039 
       0  0  0 
       5.93823e-039 0  -4.12495e+011 
       0  0  0 
       5.93823e-039 0  5.74532e-044 
       nan  nan  5.93837e-039 

Prozess beendet nach 0,05447 Sekunden mit Rückgabewert 0
Drücken jeder Schlüssel, um fortzufahren. . .

Kann mir jemand sagen, was ist los damit? Ich habe versucht, Zeiger zu verwenden, aber es wurde noch schlimmer. -Beginn

+0

'for (int i = 0; i PaulMcKenzie

+0

@PaulMcKenzie ist es eine Aufgabe Frage und das ist in der Anforderung. –

+0

Ich bin nicht in deiner Klasse, also kann ich nur allgemein antworten. Wenn Sie zählen, haben Sie nicht 50 Elemente, daher liest Ihre Schleife Daten nach dem 15. Element. Du schreibst sowieso keine "Leseschleifen".Sie sollten eine Schleife bis zum Ende der Datei oder bis zum Erreichen eines voreingestellten Limits führen *, je nachdem, was zuerst eintritt *. Für dich war der EOF zuerst, aber du hast Loopings gemacht. – PaulMcKenzie

Antwort

1

Ihre Datei hat 15 Zeilen, und so können Sie nur 15 Zeilen von Daten lesen. Sie verwenden die Variable SIZE, um zu steuern, wie viele Zeilen gelesen werden sollen.

Das Problem ist, dass SIZE50 ist! Es ist nicht15. Wenn Sie versuchen, über das Ende der Datei hinaus zu lesen, wird die Eingabe nicht nach der 16 th Zeile gelesen werden. Also werden die Variablen nach dem Index 15 nicht initialisiert, was undefined ist.

Erhöhen Sie entweder die Anzahl der Zeilen in Ihrer Datei auf 50 oder ändern Sie SIZE in 15.

+0

Danke! Das war alles, was ich tun musste :) –

+0

Es ist nicht UB aus einem Stream zu extrahieren, der EOF gesetzt hat. Es findet nur keine Eingabe statt. Die UB fügt nicht initialisierte Daten in cout ein. –

+0

@DavidThomas Völlig wahr :) Danke – Rakete1111

0

Wie die andere Antwort von @ Rackete1111 angibt, haben Sie zu viele Elemente angegeben, und Ihre Schleife, die die Daten liest, geht über die tatsächliche Anzahl der Elemente in Ihrer Datei.

Nachdem das gesagt wurde, gibt es wirklich nichts falsches (neben der Verschwendung von Speicherplatz, wenn Sie Ihr Array zu groß voreinstellen) mit zu vielen, wie viele Datensätze Sie haben, solange Sie die Leseschleife korrekt schreiben. Im Folgenden ist der Weg, um die Schleife zu schreiben, auch wenn Sie den „Fehler“ gemacht 50 Artikel von besagt, anstelle von 15:

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

using namespace std; 

int main(){ 
    const int SIZE=50; 
    int i; 
    struct Records { 
     string firstname; 
     string secondname; 
     float test1mark; 
     float midtestmark; 
     float annualmark; 
    }; 

    Records record[SIZE]; 

    ifstream in("Data.txt"); 

    int recCount = 0; // keep track of actual number of records 

    // loop until we reach the end of file, or until we hit SIZE records, 
    // whichever comes first 
    while (!in.eof() && recCount < SIZE) 
    { 
     in >> record[recCount].firstname >> record[recCount].secondname 
     >>record[recCount].test1mark >> record[recCount].midtestmark >> record[recCount].annualmark ; 
     ++recCount; 
    } 

    // now recCount == 15 if you have 15 items. 

Live Example

Hinweis haben wir eine while Schleife, bis die Grenze lesen ist erreicht (50), oder wir haben das Dateiende erreicht.

+0

Aber [while (! Eof ...) gilt als falsch] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition- als falsch angesehen) @PaulMcKenzie –

-1

und ich glaube, wir brauchen nicht, dass

int i; 

am Anfang

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



ifstream in("Data.txt"); 
const int SIZE = 15; 
void debugPrint(); 
void loadData(); 

struct Records { 
    string firstname; 
    string secondname; 
    float test1mark; 
    float midtestmark; 
    float annualmark; 
}record[SIZE]; 

int main() 
    { 
    loadData(); 
    debugPrint(); 
    } 

void debugPrint() 
{ 
    for (int i = 0; i < SIZE; i++) 
    { 
     cout << record[i].firstname << " "; 
     cout << record[i].secondname << " "; 
     cout << record[i].test1mark << " "; 
     cout << record[i].midtestmark << " "; 
     cout << record[i].annualmark << " " <<endl;   
    } 
    system("PAUSE"); 
} 

void loadData() 
{ 
    for (int i = 0; i < SIZE; i++) 
    { 
     if (!in) 
     {            
      cerr << "File can't be opened! " << endl; 
      system("PAUSE"); 
     } 

     in >> record[i].firstname >> record[i].secondname 
     >> record[i].test1mark >> record[i].midtestmark >> record[i].annualmark; 
    } 
}