C++ .txt Datei in zwei Variablen aufteilen

CrimeOne

Mitglied
Hallo Gemeinde
Ich hab folgendes Problem:
Ich habe eine .txt Datei in der sich mehrere Textzeilen befinden.
Das ganze ist so aufgebaut:

Wort1 - Wort2
Wort3 - Wort4

usw...
(ähnlich wie bei Vokabeln)
Nun möchte ich diese Werte einlesen und in zwei Variablen aufteilen, die erste Variable soll bei "-" zu ende sein und die zweite da dann beginnen und bis Zeilenende gehen.
Ich hab auch schon mehrere Threads gefunden wo es über so was geht... werd aber net schlau aus den Beiträgen:confused:... vielleicht könnt ihr mir da ja weiter helfen:)

Ich programmier in C++.
 
Hi Crime,

das was du vorhast, nennt man im allgemeinen Text Parsen..

Du musst dir das so vorstellen, wie eine Torte zu zerschneiden, ohne die Fruchtstücke zu zerteilen.. die sollen ja schließlich ganz bleiben ;-)

Also mit C++ und MFC geht das gaaanz einrfach..

Du zerschneidest deinen Text erstmal bei den Zeilenumbrüchen..

In etwa so:

Code:
  CStdioFile f;
  if( f.Open(myFile, CFile::modeRead, NULL ) ) {
    CString line;
    while( f.ReadString(line)) {
      // In line steht die aktuelle Zeile deiner Textdatei
      int pos = line.Find("-);
      if( pos != -1 ) {
        // In deiner Zeile existiert ein Minus, also weiter zerschneiden ;-)
        CString leftVal = line.Left(pos);
        CString rightVal = line.Mid(pos+1);
        // In leftVal und rightVal stehen nun deine Werte einer jeden Zeile .. Mache, was immer du tun musst ..
      }
    }
    f.Close();
  }

Ich hoffe das war verständlich genug ;-)

Falls du keine MFC nutzt, wird dir der Ansatz aber sicherlich weiterhelfen.

Nicht aufgeben, es lohnt sich ;-)

Grüße,

Pit
 
Hi ..

sehe gerade dass ich im C/C++ Forum bin :-)

also der Ansatz bleibt gleich, ausser dass du den eingelesenen Text aus deiner Datei bei den Zeilenumbrüchen selbst zerschneiden musst ..

Arbeite mit den Methoden zum ermitteln von Zeichen eines Strings, wie z.B. strchr();

Suche den Beginn und das Ende deiner Zeichenkette aufgrund deiner Patterns und schneide sie dann mit den entsprechenden Methoden aus.

Mit Zeigerarithmetik und strcyp, bzw. strncpy solltest du wunderbar hinkommen ;-)

VIel Erfolg...


Pit
 
Na gut jetzt das ganze mal gaaanz schick ;) (achja UNICODE direkt genutzt, damit du auch Fremdsprachen drin haben kannst ;) )

Entry.hpp
C++:
#if !defined (ENTRY_HPP__INCLUDED)
#define ENTRY_HPP__INCLUDED

#pragma once

#include <string>
#include <iostream>

struct entry 
{
    std::wstring first;
    std::wstring second;

    friend std::wostream& operator<<(std::wostream& out, entry const& data)
    { return out << data.first << L" - " << data.second; }
    friend std::wistream& operator>>(std::wistream& in, entry& data)
    { std::getline(in, data.first, L'-'); in.ignore(); std::getline(in, data.second); return in; }
};

#endif // ENTRY_HPP__INCLUDED

main.cpp
C++:
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

#include "entry.hpp"

int main()
{
    std::wifstream file_stream("input.dat");
    std::vector<entry> data;
    std::copy(std::istream_iterator<entry, wchar_t>(file_stream), std::istream_iterator<entry, wchar_t>(), std::back_inserter(data));
    // data loaded into data. output data in std::wcout
    std::copy(data.begin(), data.end(), std::ostream_iterator<entry, wchar_t>(std::wcout, L"\n"));
}
 
Zuletzt bearbeitet:
Das hab ich jetzt so zum laufen gebracht... aber wo muss ich den daa die Datei angeben damit er die Datei öffnet?
C++:
#include <string>
#include <iostream>

struct entry 
{
    std::wstring first;
    std::wstring second;

    friend std::wostream& operator<<(std::wostream& out, entry const& data)
    { return out << data.first << L" - " << data.second; }
    friend std::wistream& operator>>(std::wistream& in, entry& data)
    { std::getline(in, data.first, L'-'); in.ignore(); std::getline(in, data.second); return in; }
};



C++:
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int main()
{
    std::wofstream file_stream("input.dat");
    std::vector<entry> data;
    std::copy(std::wistream_iterator<entry>(file_stream), std::wistream_iterator<entry>(), data.begin());
    // data loaded into data. output data in std::wcout
    std::copy(data.begin(), data.end(), std::wostream_iterator<entry>(std::wcout, L"\n"));
}

Bei dem Code bekomm ich 15 Fehler wenn ich ihn versuch zu kompilieren...(!)
 
Zuletzt bearbeitet:
hier sind die Fehler die mir der Compiler ausgibt:

Kompilieren...
datei öffnen.cpp
'entry': nichtdeklarierter Bezeichner
error C2133: 'data': Unbekannte Größe
error C2512: 'std::vector': Kein geeigneter Standardkonstruktor verfügbar
error C2039: 'wistream_iterator': Ist kein Element von 'std'
error C2065: 'wistream_iterator': nichtdeklarierter Bezeichner
'entry': nichtdeklarierter Bezeichner
error C2039: 'wistream_iterator': Ist kein Element von 'std'
error C2065: 'wistream_iterator': nichtdeklarierter Bezeichner
error C2065: 'entry': nichtdeklarierter Bezeichner
error C2059: Syntaxfehler: ')'
error C2663: 'std::vector<_Ty,_Alloc>::begin': für 2 Überladung(en) gibt es keine zulässige Konvertierung für den this-Zeiger
error C2663: 'std::vector<_Ty,_Alloc>::end': für 2 Überladung(en) gibt es keine zulässige Konvertierung für den this-Zeiger
error C2039: 'wostream_iterator': Ist kein Element von 'std'
error C2065: 'wostream_iterator': nichtdeklarierter Bezeichner
error C2065: 'entry': nichtdeklarierter Bezeichner

datei öffnen - 15 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

Hoffe ihr könnt damit mehr anfangen als ich:D
 
Zurück