Dateiinhalt in String kopieren ?



  • HI Leute,

    ich habe bereits den zugriff auf die Datei realisiert nun will ich den "gesamten" inhalt in einen String kopieren, was ja einem Array entspricht. Danach möchte ich den String auf ein bestimmtes Wort durchsuchen, nach diesem Wort stehen <b> und </b> wiederrum dazwischen eine Integerzahl die sich ständig ändert. Diese will ich dann als Integerzahl im Programm weiterverwenden.

    Bsp.:

    dglsag sfagöjsdf flgbn WORT:<b>3.840</b> wussel ssuvew dlkckvl

    Gesucht ist die Zahl zwischen den <b> und </b>.

    // read.resources.from.overview.php
    #include <stdio.h>
    #include <conio.h>     // getch
    #include <string.h>
    #include <ctype.h>
    
    long filesize(FILE *f);
    char Auswahl(const char *erlaubt);
    
    int main () {
    	int  n, Wert, Ergebnis;
    	long Pos;
        FILE *f;
        char z;
    
    	printf ("\n  ------------------ read.resources.from.overview.php ------------------ \n\n");
    	if (f = fopen ("overview.php", "r+")) {
    		printf ("  Die bestehende Datei wurde geoeffnet\n");
    		printf ("  Dateigroesse = %ld Bytes\n", filesize (f));
    		fclose (f);
    	} else {
    		printf ("  Oeffnen der Datei gescheitert\n\n");
    		return 1;
    	}
    	return 0;
    }
    
    long filesize (FILE *f) {
    	long pos, laenge;
    	pos = ftell (f);          // aktuelle Position des Dateizeigers
    	fseek (f, 0L, SEEK_END);  // positioniert ans Ende der Datei
    	laenge = ftell (f);
    	fseek (f, pos, SEEK_SET); // setzt den Dateizeiger zurück
    	return laenge;
    }
    

    Gäbe es keine bessere Lösung den Wert direkt aus der Datei zu ziehen ? Ohne das ganze "erst" speicherintensiv in ein Array zu laden ?

    Mein Vorschlag:

    char *ans;
    ans = strstr(str1,'WORT:<b>'); //str1 ist der Dateistring
    

    ans = str + stellen vor dem gesuchten String.

    Danach kann ab der Position +Fundstelle +8 (+8 wegen WORT:<b>) mit:

    int isdigit(int c)
    int ispunct (int c)
    

    auf INTs geprüft werden (und punkte). bis keiner mehr kommt und ich dann folglich bei </b> angelangt bin.



  • eine optimierung könnte sein die datei zeilenweise einzulesen und nur so weit zu lesen bis die gewünschte stelle gefunden ist. und noch viel einfacher wäre es wenn du std::string verwenden würdest.
    K.



  • char *fgets (char *s, // Pufferadresse
    int n, // Puffergröße
    FILE *stream); // Dateizeiger
    

    Ich glaube du beziehst dich darauf ? Oder ?

    Die Funktion liest bis zum nächsten Zeilenwechsel und schreibt die Zeile mit dem Zeilenende-Zeichen als String (mit '\0' abgeschlossen) in den Puffer s. Das Lesen wird vorzeitig abgebrochen, wenn die Puffergröße n nicht ausreicht.

    Oder gibt es einen alternativen Operator ?

    std::string - sagt mir nix, schaue gleich nach 😉



  • string s = "der Name der Rose";
    int i1 = s.find("der");    // liefert 0
    int i2 = s.rfind("der");   // liefert 9
    

    So ? Den damit bekomm ich dann die Position von dem ersten Buchstaben meines gesuchten Search-Strings.



  • richtig mit fgets liest du die datei zeilenweise. es muss aber sichergestellt sein dass die start und endmarke in der gleichen zeile stehen sonst wirds komplizierter.
    K.



  • Also ich habs jetzt soweit geschafft das mir mein Algorythmus alles VOR der von mir gesuchten Zahl im String löscht also aus:

    s= {bla bla bla WORT:<b>3.142</b> bla bla bla}

    hab ich nun einen s1 extrahieren können:

    s1= {3.142</b> bla bla bla}

    ich will nun versuchen mit:

    int ispunct (int c)
    

    in der Zahl die/den punkt zu finden und dann anschliessend per anderen algorythmus die Zahl herauskopieren in eine int variable

    problem ist nur das ich nicht weis wie ich "ispunct" verwende.
    geht das so:

    while(s != zu ende) {
    if((int ispunct (int s))==1) {
    del the sign ..
    } else {
    geh auf nächstes zeichen und fang wieder hole alles
    }
    }
    

    Wäre nett wenn mir jemand mein beispiel korigiert oder mir ein eigenes vorlegt.

    Vielen dank 😉

    P.s.: mein SourceCode veröffentliche ich im Nächsten Post, bin nicht zu hause und hab den hier nicht rumliegen.



  • string dateiinhalt = "asöldklsaölskdjf <b>3.128</b> sdflkasf";
    unsigned pos1 = dateiinhalt.find("<b>");
    unsigned pos2 = dateiinhalt.find("</b>");
    stringstream unwandler;
    unwandler << dateiinhalt.substr(pos1, pos2-pos1);
    double val;
    umwandler >> val;
    
    oder integer (ohne komma)
    int val2;
    umwandler  >> val2;
    

    und noch ein tip: in c++ gibts iostream statt fgets/printf/andere c-relikte



  • jojo 😉 der neue code ist kein stück mehr vom alten, ich arbeite mich also immer erst "hoch" 🙂 keine sorge nutze jetzt nur noch ausschliesslich streams.



  • // read.resources.from.index.php
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>		// getch
    #include <string.h>
    #include <string>
    #include <fstream>		// Für ifstream notwendig
    #include <iostream>		// Für cin und cout notwendig
    #include <sstream>		// Umwandeln von Strings in Zahlen
    
    using namespace std; 
    
    double read_index();
    
    int main () {
    	int rueckgabewert = 0;
    	cout << "\n ------------------ read.resources.from.index.php ------------------ " << endl;
    	cout << " Version: 0.5b \n" << endl;
    	rueckgabewert = read_index();
    
    	return 0;
    }
    
    double read_index() {
    
    	string s;
    	string s1;
    	int gefunden = -1;
    	double rueckgabewert_der_funktion = -1;
    
    	ifstream infile;
    	infile.open("index.php");
    
    	while((suchwort_gefunden == -1)) {					// && != EOF
    		getline(infile, s);
    		gefunden = s.rfind("suchwort");
    		if (suchwort_gefunden != -1) {
    			unsigned pos1 = s.find("suchwort:<b>");
    			unsigned pos2 = s.find("</b>");
    			s1 = s.substr(pos1+3, pos2-pos1-3); // +12 wegen suchwort:<b> und -3 wegen </b> (pos ist zeigt vor >)
    		}
    	}
    
    	cout << " " <<s1 << endl;
    
    	infile.close();
    	return rueckgabewert_der_funktion;
    }
    

    So erstmal der derzeitige Sourcecode, problem bereitet mir jedoch immer noch die umwandlung von dem String "4.321" in eine INT Zahl 4321. Die oben genannte Lösung wird von MS Visual C++ Comp irgendwie nicht angenommen.

    Hab ich vergessen etwas zu incld. ? Oder was mache ich falsch ? Ich hätte paar Behelfslösungen, also ich würde die punkte suchen und aus dem String löschen, danach müsste ich ja eigentlich den string direkt als int per typcast speichern können. Oder ?

    Zudem, wie baue ich bitte das End Of File ein ? Ich habs zwar versucht aber irgendwie bekomm ich nur Fehlermeldungen. Junge Junge 😉 so viele Ideen aber ich komme nur schleppend vorran.


Anmelden zum Antworten