Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [c++] mehrere Variablen aus Textdatei lesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.08.2008, 19:01 Uhr
guddy



Hallo.

Ich habe folgendes Problem. Ich möchte aus folgender Textdatei 4 Werte in Variablen unterschiedlichen Types schreiben:

Name: ran
Ort: greb
Nummer: 5
Anzahl: 22

Die Werte nach Name und Ort sollen vom Typ Char- und Nummer sowie Anzahl sollen vom Typ int sein.
Dazu muss ich sicher einen ifstream anlegen. Wie springe ich an die Stelle "Leerzeichen" oder ":" und lese den Wert der Variable bis zum Zeilenumbruch ein? Danach parsen?
Oder gehts einfacher?

Viele Grüße

Guddy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.08.2008, 20:14 Uhr
0xdeadbeef
Gott
(Operator)


In etwa so:

C++:
#include <iostream>
#include <sstream>
#include <string>

int main() {
  std::string input = "Name: ran\nOrt: greb\nNummer: 5\nAnzahl: 22\n";
  std::string var, val;

  std::istringstream in(input);

  for(int i = 0; i < 4; ++i) {
    std::getline(in, var, ':'); // Einlesen bis :
    in.ignore(); // Leerzeichen ignorieren
    std::getline(in, val); // Einlesen bis Zeilenende

    std::cout << var << " = " << val << std::endl;
  }
}


Ich benutze hier einen istringstream, aber mit einem ifstream funktioniert das im Grunde genauso. Natürlich ist dieser Ansatz nicht so flexibel wie ein echter Parser, aber wenn du dich auf das Dateiformat verlassen kannst, sollte das so gehen.

Das Auslesen in Strings oder Zahlen wirst du von Hand machen müssen, wie genau, hängt stark davon ab, was du mit den Werten nachher vorhast.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.08.2008, 23:16 Uhr
guddy



Die Ausgabe funktioniert mit einem ifstream leider nicht bekomme nur "=":


C++:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

int main() {
  std::string input = "Name: ran\nOrt: greb\nNummer: 5\nAnzahl: 22\n";
  std::string var, val, f;

//std::istringstream in(input);
std::ifstream in("test.txt");     // neuen Lese-Stream erzeugen
  
  for(int i = 0; i < 4; ++i) {
    std::getline(in, var, ':'); // Einlesen bis :
    in.ignore(); // Leerzeichen ignorieren
    std::getline(in, val); // Einlesen bis Zeilenende
    std::cout << var << " = " << val << "\n";
    
  }
  std::cin >> f;
}



Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Nächstes mal selbst machen.


Dieser Post wurde am 11.08.2008 um 23:34 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.08.2008, 23:34 Uhr
0xdeadbeef
Gott
(Operator)


Dann konnte er die Datei wahrscheinlich nicht öffnen. Unter der Annahme, dass du Windows benutzt, Windows lockt Dateien gern exklusiv - hast du sie noch in einem notepad offen oder so?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.08.2008, 23:37 Uhr
guddy



nein, die ist zu.

Grüße
Guddy
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.08.2008, 23:52 Uhr
0xdeadbeef
Gott
(Operator)


Liegt die Datei im Arbeitsverzeichnis, und was steht überhaupt in ihr?

Prüf mal nach, ob der std::ifstream überhaupt geöffnet wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.08.2008, 00:03 Uhr
guddy




C++:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

int main() {
  std::string input = "Name: ran\nOrt: greb\nNummer: 5\nAnzahl: 22\n";
  std::string var, val, f;

//std::istringstream in(input);
std::ifstream in("test.txt");     // neuen Lese-Stream erzeugen
  if (!in){
           std::cerr<<"Fehler beim öffnen\n";}
  for(int i = 0; i < 4; ++i) {
    std::getline(in, var, ':'); // Einlesen bis :
    in.ignore(); // Leerzeichen ignorieren
    std::getline(in, val); // Einlesen bis Zeilenende
    std::cout << var << " = " << val << "\n";
    
  }
  std::cin >> f;
}


so?
bringt fehler beim öffnen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.08.2008, 00:05 Uhr
guddy



ja steht im selben verzeichnis wie die cpp-datei.
Inhalt:

Prozessname: ran
Durchlauf: greb
Nummer: 15
Anzahl: 22
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.08.2008, 02:58 Uhr
0xdeadbeef
Gott
(Operator)


Ob sie im selben Verzeichnis wie die cpp-Datei liegt, ist unerheblich. Das Arbeitsverzeichnis ist das Verzeichnis, in dem das Programm ausgeführt wird.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: