Alternative zu fgets()?
-
du musst doch immer nur so viele elemente eines (char*) oder eines strings im speicher haben, wie die länge deines gesuchten wortes etc. ist.
Problematischerweise weiß ich ja vorher nicht, wie groß das einzulesende ist.
Und an die Länge komm ich auch nicht so einfach, wenn ich nur 'nen char-Array habe.Gäbe es eine Möglichkeit einen char-Array in string zu konvertieren? Ich dächte da an eine Schleife, die jeweils ein char-Feldelement auusliest und hinten an einen String anhängt..
-
char array[30]="testtesttest"; strlen(array); // länge des arrays
ich arbeite nicht min "string"s. (jedenfalls nur, wenns sein muss, und dass ist gott sei dank selten der fall)
du wirst doch wissen, wie viele Zeichen das gesuchte wort hat! oder? jedenfalls wirst du das wort sicher eingeben, und dann kannst du mit strlen die länge erhalten.
mfG (c)h
-
Hier erst mal der "Aufbau" der Datei:
Wort1 Wort2 Wort3 Wort4
Wort5 Wort6 Wort7 Wort8Das ganze wird jetzt wie oben eingelesen. Allerdings weiß ich ja vorher nicht, ob in der Datei 1, 10 oder 100 Zeilen stehen, da in die Datei auch geschrieben wird.
-
hast du schon mal etwas von
feof(FILE*)
oder
dem rückgabewert vonfgets(...)
gehört?
damit kann man abrufen, ob das dateiende überschritten wurde. und mit dem fgets, wieviel eingelesen wurde (wenns <=0 ist, kann nichts mehr gelesen werden
dein prob: fgets arbeitet auch mit (char*) - warum brauchst du umbedingt "string"?
mfg (c)h
-
Guestk5 schrieb:
char in[256]; FILE *Datei Datei = fopen("xxx.txt", "r"); while(!feof(Datei)) { fgets(in, 255, Datei); }
Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden
-
TactX schrieb:
Guestk5 schrieb:
char in[256]; FILE *Datei Datei = fopen("xxx.txt", "r"); while(!feof(Datei)) { fgets(in, 255, Datei); }
Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden
wo willst du dann das \0 hinschreiben?!?!?!?!mfG (c)h
-
man fgets(3) schrieb:
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.
Alles klar?
-
warum brauchst du umbedingt "string"?
Für die find()- Sache. Da mir "string" ja zur Verfügung steht, sehe ich keinen Grund, es nicht zu benutzen, da es den Rest auch erleichtert.
Du solltest in der fgets()-Zeile schon 256 eintragen. Du willst doch kein wertvolles Byte verschwenden
Bin davon ausgegangen, dass das \0 irgendwo noch gespeichert werden muss...
damit kann man abrufen, ob das dateiende überschritten wurde. und mit dem fgets, wieviel eingelesen wurde (wenns <=0 ist, kann nichts mehr gelesen werden
Soweit klar...dafür ja die Schleife. Aber damit ist das Array-Größen-Problem noch nicht gelöst.
Hättest du evtl. mal ein Code-Listing damit ich mir das besser vorstellen kann?
-
Ich hab mal ein kleines Prog geschrieben das anliche sachen macht, aber nicht mit strings oder Zeichenketten arbeitet sonder mit bytes...sollte jedoch fur Strings auch funktionieren.
Ich will vorwegnehmen, dass ich C/C++ Anfanger bin, also bitte nich gleich flamen, wenn's Scheisse ist.
FILE *fin; char* pFindPos; char* pSearchStart; // Die gesuchte Zeichenkette char* flag = "find this"; int flagLength = strlen(flag); // open file for read/binary if (!(fin = fopen(inputFileName, "rb"))) return 1; // get file length fseek(fin,0,SEEK_END); length = ftell(fin); fseek(fin,0,SEEK_SET); // read in Buffer char * pfileBuffer = new char [length]; fread(pfileBuffer,1,length,fin); fclose(fin); pSearchStart=pfileBuffer; //Alle byte-Folgen finden: while ( pFindPos = findSequence (pSearchStart,length,flag,flagLength)) { //Byte-Folge gefunden ... //Neue Startposition und Lange des gesuchten Bereiches setzten. pSearchStart = pFindPos; length -= (int)(pFindPos-pSearchStart); } delete [] pfileBuffer;
Search-Funktion:
char* findSequence (char* findInHere, int findInHereLength, char* findThis, int findThisLength) { // finds a sequence of bytes in memory // returns a pointer to the first occurance of 'findThis' or NULL if (findInHere && findThis) { for (int i=0;i < (findInHereLength-findThisLength+1);i++) { if (findInHere[i]==findThis[0]) { if ( findThisLength > 1 ) { for (int j=1;j<findThisLength;j++) { if (findInHere[i+j]==findThis[j]) { if (j == (findThisLength - 1)) { return findInHere+i; } } else { j = findThisLength; } } } else { return findInHere+i; } } } } return 0; }
-
ach Misst, ich kann meinen Beitrag nicht editieren...
ich hab bloderwieser wichtingen code rausgeschnitten:
[cpp] //Neue Startposition und Lange des gesuchten Bereiches setzten.
findPos += flagLength;
pSearchStart = pFindPos;
length -= (int)(pFindPos-pSearchStart);
[/cpp]