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.