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

orffyre

Erfahrenes Mitglied
Hallo werte Forums-Mitglieder!

Ich muss ein kleines Projekt in C++ machen, habe aber schon ewig nichts mehr in dieser Programmiersprache gemacht. Vielleicht könnt ihr mir ja helfen...

Also:

Ich habe ein sogenanntes Trace-File, das ist 4MB gross. In diesem Trace-File muss ich nach Strings suchen, die "request 22" und "response 62" beinhalten.

Wenn ich das gemacht habe soll er mir alle gefundenen Strings in einer Textdatei ausgeben.

Optional, nachdem das funktioniert hat: die Strings mit dem "request" und "response" chronologisch ordnen.

Vielen Dank für Eure Hilfe im Vorraus!

Viele Grüsse,
orffyre

[update I]

okay, ich habe das mit dem Datei einlesen so gemacht:

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

using namespace std;

int main(int argc, char *argv[])
{
	string line;
 
	ifstream readFile("C:\\Dokumente und Einstellungen\\User\\Eigene Dateien\\trace.0");
  	 
	if(readFile.is_open())
	{
      		while(! readFile.eof() )
    		{
				 getline(readFile,line);
				 cout << line << endl;
 
			}
			readFile.close();
	}
	else
 		cout << "Datei konnte nicht gelesen werden!" << endl;
    		
	system("PAUSE");
	return EXIT_SUCCESS;
}

Jetzt muss man ja eigentlich nur in der while-Schleife angeben, dass er nur die Zeilen ausgeben soll, wo ein "request 22" und eine "response 62" vorkommt.

Wenn er das jetzt ausgibt gibt er natürlich die komplette 4MB-Datei aus.

Dank im Vorraus!
 
Zuletzt bearbeitet:
So macht man das aber nicht ;)

C++:
#include <iostream>
#include <fstream>
#include <string>
    
int main()
{
	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::ofstream file_stream_save("C:\\Dokumente und Einstellungen\\User\\Desktop\\encrypt.txt");

	std::string line;
	while (std::getline(file_stream_read, line))
		if (line.find("request 22") != std::string::npos || line.find("response 62") != std::string::npos)
			file_stream_save << line << std::endl;
				 getline(readFile,line);

	return std::cin.ignore();;
}
... so solltest du die gewünschte Datei aufm Desktop haben ;)
 
@devDevil: Also erstmal ein GROSSES Dankeschön, dass du mir hilfst!

Leider ist bei dem Code-Snippet nicht ersichtlich, wo die ganzen Klammern hingehören.

Bei mir meckert er zudem in Zeile 16 und sagt: "readFile nicht deklarierter Bezeichner"
sowie in Zeile 18: "'return' : 'class std::basic_istream<char,struct std::char_traits<char> >' kann nicht in 'int' konvertiert werden".

Viele Grüsse,
orffyre
 
Hmm okay. Ich sollte mal wieder besser lesen was ich schreibe :( Hab vergessen readFile anzupassen in file_stream_read ...

dann einfach das return vor std::cin.ignore(); weglassen und schon sollte es gehen ;)
 
Hallo,

ich glaub du solltest deine Programmbeispiele vorher ausprobieren, bevor du die hier postest...

schau mal hier:

stdafx.h
C++:
// stdafx.h : Includedatei für Standardsystem-Includedateien
// oder häufig verwendete projektspezifische Includedateien,
// die nur in unregelmäßigen Abständen geändert werden.
//

#pragma once

#ifndef _WIN32_WINNT        // Lassen Sie die Verwendung spezifischer Features von Windows XP oder später zu.                   
#define _WIN32_WINNT 0x0501    // Ändern Sie dies in den geeigneten Wert für andere Versionen von Windows.
#endif                        

#include <stdio.h>
#include <tchar.h>

#include <iostream>
#include <fstream>
#include <string>

C++:
#include "stdafx.h"
    
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	
	const char *inputFilePath = "C:\\test.trace";
	const char *outputFilePath = "C:\\test.out";

	ifstream inputFileStream(inputFilePath);
	if (!inputFileStream) 
	{ 
		cerr << "Could not open " << inputFilePath << " for reading " << endl; 
		return 1; 
	}

 	ofstream outputFileStream(outputFilePath);

	string line;
	while (getline(inputFileStream, line))
	{
		if (
			line.find("request 22") != string::npos 
			|| line.find("response 62") != string::npos
			)
		{
			outputFileStream << line << endl;
		}
	}
    
	inputFileStream.close();
	outputFileStream.close();

	return 0;
}

Input file:
Code:
abc
def

gdh
jkl
request 22 AAAA
djdjjd
response 62 XXX
sashdhjk
Bubu

Output file:
Code:
request 22 AAAA
response 62 XXX

Gruß Tom
 
Sachse kurz wo der unterschied zwischen den beiden, deiner Meinung nach sein soll?

Außer das du munter C Header nutzt (wenn dann wäre es <cstdio>), die du garnicht brauchst. <tchar.h> nimmst obwohl der Rest deiner Anwendung komplett in Multibyte gehalten ist (außer Einstiegspunkt ... ).
Du den Einstiegspunkt mit Parameterübergabe gewählt hast, was du garnicht brauchst.
Und hey, wo siehst du bitte <windows.h>, sodass sich _WIN32...-Define lohnen würde?

Wofür dabei einen extra Header nutzen? Das ist nur der Einsteigspunkt!

Was using namespace bewirkt und ob das immer so sinnvoll ist ... darüber lässt sich streiten ... hast ja zumindest drauf verzichtet, das in den Header zu packen...

So, dass zu deinem Konstruktiven Beitrag.
 
Hallo,

immer schön die Füße still halten!
Zum einen hab ich mit meinem Kommentar sagen wollen, das deine Beispiele so wie du sie postest nicht funktionieren. Zum anderen hab ichs nur schnell in VC++ auf Basis einer mit dem Assistenten generierten Konsolenanwendung korrigiert, zum laufen gebracht und in eine IMHO besser lesbare Form überführt.

Natürlich sind da kleinere Stilblüten drinnen, aber ich glaube die Leute haben so mehr davon, als wenn man denen einfach irgendwas dahinklatscht was nicht funktioniert.

Du machst einen kompetenten Eindruck, wenn du deine Beispiele ein wenig sorgfältiger Bauen würdest hätten wir alle mehr davon :)

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

using namespace std;
int main()
{
	
	const char *inputFilePath = "C:\\test.trace";
	const char *outputFilePath = "C:\\test.out";

	ifstream inputFileStream(inputFilePath);
	if (!inputFileStream) 
	{ 
		cerr << "Could not open " << inputFilePath << " for reading " << endl; 
		return 1; 
	}

 	ofstream outputFileStream(outputFilePath);

	string line;
	while (getline(inputFileStream, line))
	{
		if (
			line.find("request 22") != string::npos 
			|| line.find("response 62") != string::npos
			)
		{
			outputFileStream << line << endl;
		}
	}
    
	inputFileStream.close();
	outputFileStream.close();

	return 0;
}

Gruß Tom
 
Also erstmal DANKE an Euch beide! Das Programm funktioniert soweit!

Jetzt ist es natürlich so, dass mein Output nicht geordnet ist. Das müsste ich noch implementieren.

Die Zeilen in meinem Output sehen ungefähr so aus:

Code:
3237.033114 05 CH: SAMF_204    request is: 22
3237.064795 05 CH: SAMF_204   response is: 62
3237.909738 01 CH: ROOF_204    request is: 22
3237.960648 01 CH: ROOF_204   response is: 62
3238.003863 02 CH: TSLM_204    request is: 22
3238.091507 02 CH: TSLM_204   response is:  62
3238.795608 07 CH: SAMF_204    request is: 22
3238.866823 07 CH: SAMF_204   response is: 62
3239.278366 06 CH: IC_204    request is: 22
3239.575842 06 CH: IC_204   response is: 62 
3286.460462 02 CH: EIS_204    request is: 22
3286.525000 02 CH: EIS_204   response is: 62
3297.018630 00 CH: EIS_204    request is: 22
3297.047421 00 CH: EIS_204   response is: 62

Der Output sollte immer nach dem Kriterium EIS_204, SAMF_204, usw. geordnet werden. (die dritte Spalte) Also dass alles, wo EIS_204 drin vorkommt, das IMMER vor IC_204 steht, etc.

Der Code sollte dann so aussehen:

Code:
3286.460462 02 CH: EIS_204    request is: 22
3286.525000 02 CH: EIS_204   response is: 62
3297.018630 00 CH: EIS_204    request is: 22
3297.047421 00 CH: EIS_204   response is: 62
3239.278366 06 CH: IC_204    request is: 22
 3239.575842 06 CH: IC_204   response is: 62
3237.909738 01 CH: ROOF_204    request is: 22
 3237.960648 01 CH: ROOF_204   response is: 62
3238.795608 07 CH: SAMF_204    request is: 22
 3238.866823 07 CH: SAMF_204   response is: 62
3237.033114 05 CH: SAMF_204    request is: 22
 3237.064795 05 CH: SAMF_204   response is: 62
3238.003863 02 CH: TSLM_204    request is: 22
 3238.091507 02 CH: TSLM_204   response is:  62

Ich merke, ich bin völlig verrostet. Soll ich das mit Bubblesort machen? Geht das überhaupt?

Vielen Dank im Vorraus!

Viele Grüsse,
orffyre
 
Na du hast ja sogar ne feste Länge ;) Einfach ganze Zeile einlesen, am einfachsten ließt de erst in nen vector ein, dann gehst de hin und &line.c_str()[19] und die dann sorten ;) schon bisse durch :D
 
@devDevil: Hmmm. Also muss ich mich nochmal in da Zeug mit den Vektoren einlesen. Sind doch sowas ähnliches wie Pointer, richtig!? Das Programm muss bis Montag fertig sein. Wenn dir was konkretes einfällt, lass es mich wissen, bin nicht so der Checker leider...

Viele Grüsse und Danke trotzdem!
orffyre
 
Zurück