2009-03-13 9 views
2

Ich versuche, Informationen aus einer Textdatei zu sammeln, die Namen von Organisationen (ohne Leerzeichen) und Fließkommazahlen enthält. Ich möchte diese Informationen in einer Array-Struktur speichern.Detective Newline-Byte von filestream

Das Problem, das ich bisher habe, ist das Sammeln der Informationen. Hier ist ein Beispiel der Text-Datei:

CBA 12,3 4,5 7,5 2,9 4,1

TLS 3,9 1 8,6 12,8 4,9

kann ich bis zu 128 verschiedene Nummern für jede Organisation und bis zu 200 Organisationen in der Textdatei. Diese

ist, was meine Struktur sieht wie bisher:

struct callCentre 
{ 
char name[256]; 
float data[20]; 
}; 

Mein Haupt:

int main() 
{ 
callCentre aCentre[10]; 
getdata(aCentre); 
calcdata(aCentre); 
printdata(aCentre); 
return 0; 
} 

Und die getdata Funktion:

void getdata(callCentre aCentre[]) 
{ 
ifstream ins; 
char dataset[20]; 

cout << "Enter the name of the data file: "; 
cin >> dataset; 

ins.open(dataset); 

if(ins.good()) 
{ 
    while(ins.good()) 
    { 
     ins >> aCentre[c].name; 
     for(int i = 0; i < MAX; i++) 
     { 
      ins >> aCentre[c].data[i]; 
      if(ins == '\n') 
       break; 
     } 
     c++; 
    } 
} 
else 
{ 
    cout << "Data files couldnt be found." << endl; 
} 
ins.close(); 
} 

Was ich versuche zu erreichen, In meiner getdata-Funktion ist dies: Speichern Sie den Namen der Organisation zuerst in der Struktur, dann lesen Sie jedes float in die Daten Arra y bis das Programm ein Newline-Byte erkennt. Bis jetzt funktioniert meine Überprüfung für das Newline-Byte jedoch nicht.

Angenommen, die Variablen c und MAX sind bereits definiert.

Wie soll ich das richtig machen?

Antwort

2
char byte = ins.peek(); 

Oder

if(ins.peek() == '\n') break; 

(Edit): Sie werden auch für ein EOF nach dem flüchtigen Blick überprüfen wollen(), da einige Dateien möglicherweise keine Endung Newline haben.

Ich möchte darauf hinweisen, dass Sie möglicherweise eine vector<callCentre> anstatt einer statischen Array verwenden möchten. Wenn die Länge der Eingabedatei die Kapazität des Arrays übersteigt, werden Sie den gesamten Stack durchlaufen.

+0

Das hat genau das gemacht, was ich wollte. Vielen Dank. – Bobby

3

Der Operator >> behandelt Whitespace als Trennzeichen, und das enthält Zeilenumbrüche, so dass es nur diese isst und Sie nie sehen.

+0

Nicht wahr, es wird alles auffressen bis zum Whitespace-Zeichen, das nächste Mal, wenn Sie es danach aufrufen, wird das Whitespace-Zeichen übersprungen, bis es ein anderes Whitespace-Zeichen erreicht. "hallo da" Wird dazu führen, dass Hallo gegessen wird, und "da" immer noch herum. –

+0

Fortsetzung Mit .peek() können Sie dann überprüfen, was das nächste Zeichen in der Zeile ist. –

+0

@ X-Isstance mit "essen" Ich meinte, sie wurden übersprungen und du hast sie nicht gesehen. Zwei Verwendungen von >> auf "hallo \ n da" ergeben "Hallo" und "da", oder? – Rubendv

3

Sie müssen Zeilen lesen und dann die Zeilen zerhacken. Das folgende Stück hackery zeigt die Grundidee:

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

int main() { 
    string line; 
    while(getline(cin, line)) { 
     istringstream is(line); 
     string cs; 
     is >> cs; 
     double vals[10]; 
     int i = 0; 
     while(is >> vals[i]) { 
      i++; 
     } 

     cout << "CS: " << cs; 
     for (int j = 0; j < i; j++) { 
      cout << " " << vals[j]; 
     } 
     cout << endl; 
    } 
} 
+0

Ich habe versucht, dies zu implementieren. Gute Idee aber. – Bobby

2

ich die Datei eine Zeile nach der anderen lesen würde, und analysieren jede Zeile einzeln für die Werte:

std::string line; 
while (std::getline(ins, line)) { 
    std::istringstream sline(line); 
    sline >> aCentre[c].name; 
    int i = 0; 
    while (sline >> aCentre[c].data[i]) 
    i++; 
    c++; 
}