Anfängerin braucht Hilfe! Einlesen aus einer Date und in Liste speichern
-
Mein Programm soll eine Eingabedatei als Parameter übergeben bekommen.
Meine Idee ist:#include <string> #include <fstream> using namespace std; int main() { char dateiname[50] = 0; char line[1000] = 0; char type; int n,m; cout << "Bitte Name der Datei, die Graphen enthält eingeben: " \n; cin >> dateiname; ifstream file (dateiname, ios::in | ios::nocreate); if (!file) {cout << "Es ist nicht möglich, diese Datei zu öfnnen."; return 0;}Jetzt enthält diese Eingabedatei 3 Arten von Zeilen
1. 1. Zeichen ist "c": nur Kommentar, soll überlesen werden
2. 1. Zeichen ist ein "p" (1 Zeile), dahinter stehen 2 Zahlen, die erste soll der Variablen n zugeordnet werden, die zweite der Variablen m aus meinem Programm.
3. 1. Zeichen ist ein "e" (m Zeilen )., dahinter stehen wieder 2 Zahlen zwischen 0 und n-1. Diese sind die eigentlich wichtigen.
Ich will sie so abspeichern, daß ich eine Liste bekomme, oder besser eine Art Array mit n-1 Feldern, in denen die Zahlen 0 bis n-1 stehen. Von jedem Feld geht nun eine Liste ab, wobei das Arrayfeld den Kopf bildet. In dieser Liste stehen sämtliche "Partner" aus den Zeilen e. Also wenns ne Zeile mit "e 3 5" gibt, dann ist in der Liste, die an 3 hängt ne 5 drin und andersrum....Hier hab ich noch keine richtige Idee...
if (!file.getline (line , 80)) return 0; //liest eine Zeile while (1) { if (!(file >> type)) break; //liest einen Wert switch (type) { case c : break; case p :

Ich weiß nicht, wie ich auf die einzelnen Zahlen zugreifen könnte....
Vielen vielen Dank, wenn mir jemand helfen kann !!!!
jakky
-
Poste mal eine Beispiel Datei und wie dann deine Variablen aussehen sollen.
mfg.
-
Eine Datei sieht zum Beispiel so aus:
c Beispiel
c
c blabla
p 4 5
e 0 3
e 1 2
e 1 3
e 2 3
e 0 2Die Speicherung sollte dann so sein: n = 4, m = 5
Und die Liste:
0 -> 3 -> 2 oder 0 -> 2 -> 3 (Reihenfolge ist egal)
1 -> 2 -> 3 oder 1 -> 3 -> 2
2 -> 0 -> 1 oder ...
3 -> 0 -> 2 ->1 oder...
-
war doch schon ganz ok wie du das hast
while (file) { char type; file >> type; //liest einen Wert switch (type) { case 'c' : std::string comment; file>>comment; // klappt nur mit einwörtigen Kommentaren, wenn welche drin sein sollen die mehr Worte haben mit getline oder eine kommentarabschluss /c oder so arbeiten break; case 'p' : int z1, z2; file>>z1;file>>z2; // was mit z1/z2 machen break; usw
-
while (file) file >> type; // liest einen Wert ein switch(type) { case 'c': file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break; case 'p': int n,m; file>>n; file>>m; file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break; case 'e': file >> c1; file >> c2; kante_einfuegen(c1,c2); file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break;Kann ich das so lösen, damit er nachdem er die benötigten Zeichen gelesen hat, in die nächste Zeile springt ?
Und dann hab ich noch ne Frage: Bei mir taucht bei
void visitbfs (int k) { int j; static int i = 0; ListNode *t; queue_put (k); while (! queue_empty()) { j = queue_get(); a[j].count = ++i; cout << a[j].name << " "; for ( t = a[t].next; t; t = t -> next) if (a[t -> index].count == 0) {queue_put( t-> index); a[ (t-> index)].count = -1;} } }immer für die for-Schleife folgender Fehler auf: "error C2107: illegal index, indirection not allowed" bzw. "error C2228: left of '.next' must have class/struct/union type" auf. Was mache ich falsch ?
-
jakky schrieb:
while (file) file >> type; // liest einen Wert ein switch(type) { case 'c': file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break; case 'p': int n,m; file>>n; file>>m; file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break; case 'e': file >> c1; file >> c2; kante_einfuegen(c1,c2); file.getline (line, 100); //bis zur naechsten Zeile vorrücken, max. 100 Zeichen break;Kann ich das so lösen, damit er nachdem er die benötigten Zeichen gelesen hat, in die nächste Zeile springt ?
Kannst du machen, allerdings würde ich die Deklaration von n und m vor die Schleife setzen (ich gehe davon aus, daß du sie noch brauchst).
Und dann hab ich noch ne Frage: Bei mir taucht bei
void visitbfs (int k) { int j; static int i = 0; ListNode *t; queue_put (k); while (! queue_empty()) { j = queue_get(); a[j].count = ++i; cout << a[j].name << " "; for ( t = a[t].next; t; t = t -> next) if (a[t -> index].count == 0) {queue_put( t-> index); a[ (t-> index)].count = -1;} } }immer für die for-Schleife folgender Fehler auf: "error C2107: illegal index, indirection not allowed" bzw. "error C2228: left of '.next' must have class/struct/union type" auf. Was mache ich falsch ?
Ich vermute einen Tipfehler: "for(t=a[j].next;t;t=t->next)"