[C++]Nach String suchen, teilen und speichern

Seelenquell

Grünschnabel
Hallo!
Ich hab heute mal ein bisschen im Forum gesucht, habe aber so viele Threads gefunden, die leider nur so ähnlich sind, wie mein Problem, dass ich doch einen eigenen öffne.
Vorab:meine C++-Kenntnisse habe ich aus einer FH-Vorlesung, die schon ein paar Semester zurückliegt.

Die Aufgabenstellung:

Ich hab eine Textdatei, die folgendermaßen aufgebaut ist:
Code:
[s1?v]{s1?v SUPPLY V00.50C  8051_SIO V00.16}
[c1?v]{c1?v CYLINDER V00.50D  8051_SIO V00.16}
[v1?v]{v1?v VALVE V00.50I  8051_SIO V00.16}
[v2?v]{v2?v VALVE V00.50O  8051_SIO V00.16}
[p1?v]{p1?v0.0.8.3}
[v2?s]{v2?s01 00 01 00 0 0 20}
[s1?s]{s1?s01 01 00}
[s1?k]{s1?k00}
[c1?s]{c1?s01 01 00 0000}
[p1?s]{p1?s00}
[v1?p]{v1?p13 13 12 13}

Die geht dann noch so etwa 60000 Zeilen weiter.

Ich will die Zeilen die mit [c1?s] beginnen finden und dort die vierstellige Hex-Zahl, die am Ende der Zeile vor der Klammer steht, herausnehmen und in einer neuen Datei speichern.

Wie würdet ihr das lösen ?
In Worten würde ich es so machen:
Finde Zeile mit [c1?s] am Anfang.
Gehe An Position 21 in der Zeile und lies die 4 Zeichen dort ein.
Speichere die Zeichen in Datei.
Suche nächste Zeile mit dem gegebenen Anfang.

Leider fehlen mir ein bisschen die Befehle dazu. Interessant hat sich bisher getline() angehört.

Danke schonmal!

Lieber Grüße
Seelenquell
 
Schau mal hier:
C++:
#include <string>
#include <fstream>

int main()
{
    std::ifstream infile("input.txt");
    std::ofstream outfile("output.txt");

    if( infile.is_open() && outfile.is_open() )
    {
        std::string strLine;

        while( std::getline(infile, strLine) )
        {
            if( strLine.substr(0,3).compare("[c1") == 0 && strLine.at(4) == 's' )
            {
                outfile << strLine.substr(20,4) << std::endl;
            }
        }

        infile.close();
        outfile.close();
    }

    return 0;
}
Gruß
MCoder
 
In der Zeile 15
Code:
if( strLine.substr(0,3).compare("[c1") == 0 && strLine.at(4) == 's' )
meckert der Compiler: no matching function for call to 'std::basic_string<....
Ich benutze Dev-C++.

Danke aber auf jeden Fall schonmal !
 
Hi.
In der Zeile 15
Code:
if( strLine.substr(0,3).compare("[c1") == 0 && strLine.at(4) == 's' )
meckert der Compiler: no matching function for call to 'std::basic_string<....
Ich benutze Dev-C++.
Es wäre auf jeden Fall nützlich die ganze Fehlermeldung zu kennen. So kann man da nur raten.

Ich vermute mal dein Compiler (Dev-C++ verwendet den MinGW Compiler) bzw. die verwendete C++ Standardbibliothek kennt die Methode "at" noch nicht.

Versuch's mal so (oder poste die komplette Fehlermeldung!):
C++:
if( strLine.substr(0,3).compare("[c1") == 0 && strLine[4] == 's' )
Gruß
 
Okay, Fehler gefunden: ich hab ne Klammer vergessen. :rolleyes:
Das Programm läuft jetzt ab, allerdings wird nichts in die Output-Datei geschrieben.

Code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
 
int main(int argc, char *argv[])
{    
	std::ifstream infile("Logfile.txt");
	std::ofstream outfile("ergebnis.txt");

     if( infile.is_open() && outfile.is_open() )    
	{        
	std::string strLine;         
	while( std::getline(infile, strLine) )        
	{            
		if( strLine.substr(0,3).compare("[c1") == 0 && strLine.at(4) == 's' )
	            {       outfile << strLine.substr(20,4) << std::endl;            
			}        
	}         
	infile.close();        
	outfile.close();    
        }  

   	system("PAUSE");
	return EXIT_SUCCESS;
}

Ich hab wahrscheinlich irgendwas offensichtliches vergessen.
 
Schwer zu sagen. Evtl. kann die Eingabedatei nicht gefunden werden?

Evtl. solltest du diesen Fehler explizit abfangen:
C++:
  std::ifstream infile("Logfile.txt");
  std::ofstream outfile("ergebnis.txt");

  if (!infile.is_open()) {
    cerr << "Eingabedatei konnte nicht geöffnet werden." << endl;
    return EXIT_FAILURE;
  }
  if (!outfile.is_open()) {
    cerr << "Ausgabedatei konnte nicht geöffnet werden." << endl;
    return EXIT_FAILURE:
  }
  std::string strLine;
  while (getline( ...
Gruß
 
Habe ich jetzt gemacht. Tatsächlich kann er die Eingabedatei (und wahrscheinlich auch die Ausgabedatei) nicht öffnen. Habe jetzt mal den kompletten Pfad angegeben.
Sehe ich das richtig, dass ich beim Pfad die Backslashes doppelt setzen muss?
Das klappt jedenfalls auch nicht.

Code:
std::ifstream infile ("C:\\Dokumente und EInstellungen\\Administrator\\Eigene Dateien\\Programme\\Prog2\\Logfile.txt");

Oder muss ich die Freizeichen auch ersetzen ?
 
Hallo, es müssen nur die Backslashes doppelt gesetzt werden. Bezieht sich die Aussage "klappt nicht" darauf, dass die Eingabedatei nicht geöffnet werden kann? Überprüfe dann doch noch mal den Pfad; das lange Teil am besten auch nicht eintippen, sondern aus der Adresszeile des Explorers kopieren :)
Die Ausgabedatei ist kein Problem. Wird kein Pfad angegeben, wird sie im aktuellen Pfad (wo immer das auch gerade ist) angelegt.

Gruß
MCoder
 
Ja, die Backslashes mußt du entwerten, da sie sonst evtl. eine andere Bedeutung bekommen. Die Leerzeichen mußt du nicht entwerten.

Hast du denn wenn du das Programm ausführst die erforderlichen Rechte die Datei in dem Verzeichnis zu lesen?

Gruß
 
Ja, mit "klappt nicht" meinte ich, dass er die Datei mit dem angegebenen Pfad nicht öffnen konnte.
Das Programm, sowie die Datei liegen im gleichen Ordner in den Eigenen Dateien. Kann es da irgendwelche "rechtlichen Probleme" ;) geben ? Schreibgeschützt ist jedenfalls nichts.

P.S.: Die Ausgabedatei wird aber erstellt, wenn das Programm abgelaufen ist. Steht halt nur nichts drin.
 
Zuletzt bearbeitet:
Zurück