Trace-File einlesen, nach Strings suchen, in Datei ausgeben

Könnte mir vorstellen, dass das geht ;)
C++:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
#include <cstring>

struct helper
{
    std::string data;
    helper(std::string const& data) : data(data) {}
    operator const char*() const { return &data.c_str()[20]; };
    friend std::ostream& operator<<(std::ostream& out, helper const& data)
    { return out << data; }
};

int foo()
{
    std::ifstream file_stream_read("C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\trace.0");
    if (!file_stream_read) { std::cerr << "FEHLER: Trace-File could not be opened!" << std::endl; return 1; }
    
    std::string line;
    std::vector<helper> data;
    while (std::getline(file_stream_read, line))
        if (line.find("request 22") != std::string::npos || line.find("response 62") != std::string::npos)
            data.push_back(helper(line));

    std::sort(data.begin(), data.end(), std::strcmp);

    std::ofstream file_stream_save("C:\\Dokumente und Einstellungen\\User\\Desktop\\encrypt.txt");
    std::copy(data.begin(), data.end(), std::ostream_iterator<helper>(file_stream_save, "\n"));

    std::cin.ignore();;
}
... hab es aber nicht ausprobiert :D
 
@thread: Okay, Planänderung.

Ich muss das so hinkriegen, dass in der Ausgabedatei anstatt

Code:
3297.047421 00 CH: EIS_204   response is: 62
3238.003863 02 CH: TSLM_204    request is: 22

nur noch erscheint:

Code:
CH: EIS_204   response is: 62
CH: TSLM_204    request is: 22

Die EIS_204 und TSML_204 sind Steuergeräte.

Ich soll für jeden Fall, der auftritt, eine Extra-Datei anlegen. Also alles, was im Trace-File mit EIS_204 steht, soll in eine Datei ausgegeben werden, alles, was mit TSML_204 in eine andere Datei usw.

Zudem soll er mir nicht mehr nach "request 22" und "response 62" suchen , sondern nur noch nach " CH " (Leerzeile, CH, Leerzeile).

Bin für Eure Hilfe dankbar!

Das mit dem " CH " anstatt "request 22" und "response 62" kriege ich wahrscheinlich hin (dank eurer Hilfe, weil das Problem schon gelöst wurde), aber wie ich die in jeweils eine Datei auslagern soll weiss ich nicht. Hmmm...

Viele Grüsse und vielen Dank!
orffyre
 
@devDevil: Hast du mir eventuell den Code? Muss das heute noch fertig kriegen. Ich habe echt keinen richtigen Plan und brauche wirklich Hilfe!

Mein derzeitiger Code sieht so aus:

Code:
//Programm um trace.0-Datei einzulesen, nach "request is: 22" und
//"response is: 62" suchen zu lassen und das Ergebnis in einer Text-Datei ausgeben
#include <iostream>
#include <fstream>
#include <string>
   
       
using namespace std;

int main()

{



	//welche Datei soll eingelesen werden?
	const char *inputFilePath = "C:\\Dokumente und Einstellungen\\Schroeder\\Eigene Dateien\\trace.0";

	//wohin mit der Ausgabe?
	const char *outputFilePath = "C:\\Dokumente und Einstellungen\\Schroeder\\Desktop\\output.txt";



	ifstream inputFileStream(inputFilePath);

	if (!inputFileStream)
	{

	  cerr << "Konnte " << inputFilePath << " nicht zum Lesen oeffnen! " << endl;

	  return 1;

	}



	ofstream outputFileStream(outputFilePath);



	string line;

	while (getline(inputFileStream, line))

	{

	  if (

		  //line.find("request is: 22") != string::npos || line.find("response is: 62") != string::npos
		  line.find(" CH: ") != string::npos

		  )

	  {

		  outputFileStream << line << endl;

	  }

	}



	inputFileStream.close();

	outputFileStream.close();



	return 0;
}

Der macht folgendes: Trace-Datei einlesen, nach " CH: " suchen und mir die Ergebnisse in einer Text-Datei ausgeben.

Was er zusätzlich machen soll:
- den Output "3297.047421 00 CH: EIS_204 response is: 62" kürzen auf "CH: EIS_204 response is: 62"
- den Output chronologisch nach den Kriterien ordnen SAMF, EIS, usw.
- für jedes Steuergerät also für SAMF eine eigene Textdatei, für EIS eine eigene usw.

Danke im Vorraus!
 
Zuletzt bearbeitet:
Wie das kürzen geht, hab ich dir jetzt schon 1000mal geschrieben. Entweder std::string::substr oder einfach &std::string::c_str()[x]
=>
C++:
outputFileStream << &line[16] << endl;
oder
C++:
outputFileStream << line.substr(16) << endl;
.
 
Zurück