Daten aus Quelltext lesen / Schreiben
-
Moin leute, wollte mal fragen wie man Daten aus einem quelltext sucht und wenn man sie findet in einer .ini abspeichert.
Wäre für jede Hilfe/jedes Beispiel sehr dankbar.mfg
guest121212
-
Datei Zeile per Zeile einlesen und jedesmal überprüfen, ob dein Wort da ist.
Das müsste mit find gehen.Phille
-
PhiLLe schrieb:
Datei Zeile per Zeile einlesen und jedesmal überprüfen, ob dein Wort da ist.
Das müsste mit find gehen.Phille
K danke...
nur hab ich sowas noch nie gemacht _
ein beispiel wäre nett...
und muss halt wissen wie ers dann in einer ini abspeichert am besten wäre wenn er die Daten die er finden soll (und gefunden hat) dann in einem char array speichert und danach in der .ini schreibt.mfg
guest121212
-
Schau dich einfach mal hier im Forum um stehen genügend Beispiele. Btw. lies doch mal ein Tutorial?
gruß Tobi.
-
char daten[1000];
FILE* eingabe = fopen("Quelle.txt","r");
FILE* ausgabe = fopen("Ziel.txt","w");while(!feof(eingabe))
{
int count=fread(daten,1,1000,eingabe);
fwrite(daten,1,count,ausgabe);
}Hmm..das hab ich bis jetzt,
aber wie mach ich nun das er nur bestimmte sachen abspeichert ? bzw ausgibt...
-
Also, wenn du willst das er dir nur bestimmte dinge absichert wirst du ums parsen nicht drum rum kommen( kannst dir ja mal bei wiki anschaun was damit gemeint ist, wenn de es nicht weißt ).
Kurz:
- du hast eine Datei X, die Quelltext Datei
- du hast bzw. du wirst dir eine Datei Y erstellen, um dort deine Infos zu sichernDa Quelltext Datein enorm groß werden können, wäre es sinnvoll, die Datei Zeile fuer Zeile in einem String einzulesen oder du sicherst dir immer nur 512 Zeichen durch suchst die und machst dann mit den nächsten 512 Zeichen weiter ( Aber Achtung! es könnte passieren das du so evtl. ungewollt ein Wort teilst, also vorher immer prüfen ob da nen Withespace ist ), nicht so wie du es machen willst die komplette Datei in einen String zu packen, das geht evtl. mit kleinen Datein aber nicht wenn du nen 10000Zeilen Quelltext durchforsten möchtest.
Wenn du nun ein Teil gesichert hast in einer Variable, kannst du diesen Teil durchackern und parsen und den Teil den du für wichtig empfindest sichern.
Hier mal nen Beispiel:
Quelltext Datei: Zeile: +---------------------------------------------------------------- 1. | void Function( int iFirst, char szSecond ) { 2. | 3. | printf( "Parameter 1: %d und Parameter 2: %s\n", iFirst, szSecond ); 4. | } 5. | 6. | int iVariable = 100; ... | ...
Du siehst es wäre durch aus von Vorteil den Quelltext Zeile für Zeile einzulesen. Ließt du die erste Zeile ein, hält deine Buffer-Variable das hier:
" void Function( int iFirst, char szSecond ) {". Jetzt kannst du die Länge des Strings ermitteln und Char für Char durch suchen, du kannst sogar die string-methoden nutzen um nach ganzen wörtern zu suchen so z.B nach den Keywords von C++ ( void, int, char ... ). Du fischt dir also deine Parts raus und sicherst die in nem aderen Buffer und diesen speicherst du dann in eine Neue Datei.Hoffe es hilft dir.
Gruß Tobi
-
T0bi schrieb:
Da Quelltext Datein enorm groß werden können, wäre es sinnvoll, die Datei Zeile fuer Zeile in einem String einzulesen oder du sicherst dir immer nur 512 Zeichen durch suchst die und machst dann mit den nächsten 512 Zeichen weiter ( Aber Achtung! es könnte passieren das du so evtl. ungewollt ein Wort teilst, also vorher immer prüfen ob da nen Withespace ist ), nicht so wie du es machen willst die komplette Datei in einen String zu packen, das geht evtl. mit kleinen Datein aber nicht wenn du nen 10000Zeilen Quelltext durchforsten möchtest.
1. Wenn ein einzelnes Source File eines Projekts 10.000 Zeilen hat, will ich - und viele andere - damit nichts zu tun haben.
2. Stur eine feste Anzahl an Bytes zu lesen ist wohl kompletter unfug, Zeile für Zeile einzulesen ist in C/C++ - Sources bestenfalls subobtimal. Entweder sofort Token um Token oder komplette Statements. Nur auf Whitespaces zu achten um festzustellen ob man ein Token zerrissen hat, reicht nicht.@OP: Deine Frage ist leider etwas schwammig formuliert. Ich sehe aber durch meine Glaskugel, dass Du nach Literalen suchen willst, um sie dann - einem entsprechenden Identifier zugeordnet - in eine .ini zu schreiben.
Wie zeichnen sich die Literale aus, die Du suchen willst? (Sind sie vielleicht immer in initialisierungen zu finden?)
Wie willst du den in die .ini zu schreibenden Literalen die richtigen Namen zuordnen?Daraus ergeben sich folgende Aufgaben:
- Schreibe eine Funktion, die dir das nächste Token aus der Datei liefert.
- Schreibe eine Funktion, die dir das nächste Statement (=Array aus Tokens) aus der Datei liefert (indem sie die Funktion für das nächste Token verwendet; Stop bei ";").
- Schreibe eine Funktion, die feststellt, ob es sich bei einem Statement um eine Deklaration handelt. In diesem Fall ist das erste Token entweder ein Modifier (
unsigned
,short
,register
, ...) oder ein eingebauter Typ (char
,short
,int
, ...). - Schreibe eine Funktion, die Namen/Werte-Paare in Deklarationen findet und in einem dynamischen Array eines
struct { char* name, *value };
ablegt. - Schreibe eine Funktion, die die gefundenen Namen/Werte-Paare in eine Datei schreibt.
- Du hast fertig
cheers, Swordfish
edit: zu müde für Rechtschreibung...
edit2: Das funktioniert natürlich nur für eingebaute Typen. Für alles andere musst du tatsächlich Compiler spielen.