Woodstock Geschrieben 19. Dezember 2001 Geschrieben 19. Dezember 2001 Also, ich lese aus einer Datei Worte aus. Ab der zweiten Datei setzt er mir vor das erste Wort aus der Datei (sind halt mehrere, die ich nacheinander durchforste), immer ein y mit zwei Punkten davor. Warum? Bevor ich etwas in mein Array schreibe, in dem ich die Ausgelesenen Wörter zwischenspeicher, um sie dann zu überprüfen, lösche ich den gesamten Inhalt. Es kann also nicht sein das das von etwas kommt was vorher darin gestanden hat. Könnt Ihr mir helfen? Bine Zitieren
Poldi Geschrieben 19. Dezember 2001 Geschrieben 19. Dezember 2001 was du immer für probleme hast ... vielleicht solltest du lieber unter linux programmieren ... also wenn du die variable immer leerst vorher, kann ich mir das auch nicht erklären. poste doch mal n bischen quellcode ... Zitieren
Woodstock Geschrieben 19. Dezember 2001 Autor Geschrieben 19. Dezember 2001 Nun, wenn ich mich mit Linux schon so gut auskennen würde, würde ich das machen. Klappt aber noch nicht ganz so gut. Also: #include"Sabine(1).h" // da sind alle Include Dateien drin die ich brauche void Auslesen(char *b, char szEingabe[][1001], int nAnSuchw, char* szSuchkriterium, long& nScnt) { int nC, nPos = 0, nY = 0, nI, nD, nScnt2=0, nE, nScnt3=0, nX, nPos1=0, nS; bool afPruefung[50], fFound=true; char szAusgelesenes[50], szBufferIndex[501]; char szBufferPfad[501], chA[20], chB[20], chC[20]; char chD[20], chE[500], chF[500], szDoppelt[15000][50], a[1000]; FILE *FZ, *FW, *FX, *FV, *FY, *FT, *FU; strcpy(chA, "c:\\index.tmp.txt"); strcpy(chB, "c:\\index.txt"); strcpy(chC, "c:\\Pfad.tmp.txt"); strcpy(chD, "c:\\Pfad.txt"); strcpy(chE, "c:\\Datei.txt"); strcpy(chF, "c:\\Datei.tmp.txt"); FZ = fopen(b, "r"); /* In b wird mir von der vorherigen Funktion der Pfad der Datei übergeben die ich jetzt Zeichenweise auslese und dann Wörter überprüfe (insgesamt übergibt er mir vier Dateien, mehr brauche ich zum ausprobieren ob es klappt nicht, aber später werden natürlich mehr Dateien übergeben)*/ FX = fopen(chB, "r"); FY = fopen(chC, "a+"); FW = fopen(chA, "a+"); FV = fopen(chD, "r"); FU = fopen(chE, "r"); FT = fopen(chF, "a+"); /* Falls ich schon eine Datei durchsucht habe, ist nScnt > 0, da ich mit jedem Wort nScnt erhöhe. Folgendes mache ich, damit die Wörter die ich bereits in die index.tmp.txt geschrieben habe (welche ich am ende in index.txt umbenannt habe), auch weiterhin in der Datei stehen, und der Rest nur angehängt wird */ if(nScnt>0) { nD = 2; while(nD!=EOF) { nD = fgetc(FX); szAusgelesenes[0] = nD; fwrite(szAusgelesenes, sizeof(char), 1, FW); } fclose(FW); fclose(FX); FX = fopen(chB, "r"); FW = fopen(chA, "a+"); } for(nD=0; nD<50; nD++) szAusgelesenes[nD] = NULL; // Initialisierung des Arrays szAusgelesenes, damit dadrin aufkeinen Fall mehr etwas steht nC = 2; // nC = 2, damit die Datei aufjedenfall durchforstet wird while (nC != EOF) // auslesen von Zeichen bis zum Dateiende { nC = fgetc (FZ); // auslesen if ((nC<'A'||nC>'z')||(nC>'Z'&&nC<'a')) // falls kein Buchstabe { szAusgelesenes[nPos] = '\0'; // Nullzeichen zum zeigen das Wortende anhängen _strlwr(szAusgelesenes); //Wort auf Lowercase setzen if(nScnt==0) // beim allerersten Wort { if(strlen(szAusgelesenes)>1) // wenn Wort mehr als 1 Buchstaben hat { Schreiben(FT, FU, FV, FW, FX, FY, FZ, szAusgelesenes, nScnt, szBufferDateiPfad, ; /* ausgelesenes Wort wird in die index.tmp.txt geschrieben genau so wie ein Zeilenvorschub, der Pfad in die Pfad.tmp.txt und Wort plus Pfad in die Datei.tmp.txt */ } // if } // if if(nScnt>0) // bei weiteren Wörtern { if(strlen(szAusgelesenes)>1) // wenn mehr als ein Buchstabe { fFound = false; // zum Überprüfen ob das Wort schon einmal in vorgekommen ist for(nS=0; nS<501; nS++) szBufferIndex[nS] = NULL; nX = 2; // aus der Index.txt wird ausgelesen, damit kein Wort doppelt geschrieben wird, Überprüfung ob das Wort in einer voher geöffneten Datei schon mal stand while (nX != EOF) // solange bis Dateiende { nX = fgetc (FX); // auslesen if ((nX<'A'||nX>'z')||(nX>'Z'&&nX<'a')) // wenn kein normaler Bcuhstabe { if(strlen(szBufferIndex)>1) // wenn mehr als ein Buchstabe { szBufferIndex[nPos1] = '\0'; // anfügen des Nullzeichens _strlwr(szBufferIndex); // auf Lowercase setzen (nur zur Sicherheit, weil es eigentlich auf Lowercase sein müsste) if(strstr(szBufferIndex, szAusgelesenes)!=0) // überprüfen ob das Wort schon einmal da war { fFound = true; // wenn ja, fFound = true } nPos1 = 0; // Positionszähler auf Null } // if } // if else // wenn ein normaler Buchstabe { szBufferIndex[nPos1] = nX; // Buchstaben an die Position nPos schreiben nPos1++; // nPos erhöhen, damit nächster Buchstabe angefügt wird, und nichts überschreibt } // else } // while fclose(FX); //schließen und wieder öffnen, damit ich wieder am Dateianfang bin FX = fopen(chB, "r"); for(nD=0; nD<=nScnt2; nD++) // überprüfen ob das Wort schon einmal in der zur Zeit geöffneten Datei stand { if(strcmp(szDoppelt[nD], szAusgelesenes)==0) { fFound = true; // SchreibenJa(a, FT, FU, FV, FW, FX, FY, FZ, szAusgelesenes, szBufferPfad, szBufferDateiPfad, ; break; } } if (fFound==false) // wenn das Wort noch nicht vorkam in die index.tmp.txt schreiben { Schreiben(FT, FU, FV, FW, FX, FY, FZ, szAusgelesenes, nScnt, szBufferDateiPfad, ; strcpy(szDoppelt[nScnt2], szAusgelesenes); nScnt2++; } // if } // if } // if nPos = 0; // Positionszähler wieder auf Null, da ja jetzt ein neues Wort kommt for(nD=0; nD<50; nD++) szAusgelesenes[nD] = NULL; // initialisierung des Arrays mit Null damit da nichts mehr drinsteht } // if else { szAusgelesenes[nPos] = nC; // Buchstaben an Position schreiben nPos++; // Position erhöhen, damit nichts überschrieben wird durch den nächsten Buchstaben } // else } // while fclose(FX); // schließen der Dateien fclose(FZ); fclose(FW); fclose(FV); fclose(FY); fclose(FT); fclose(FU); remove(chE); // löschen der index.txt, Pfad.txt und Datei.txt, damit ich die *.tmp.txt Dateien umbenennen kann remove(chB); remove(chD); rename(chF, chE); // umbenennen der Dateien rename(chA, chB); rename(chC, chD); } // Auslesen [/code]Ich weiß es sind noch Variablen in dem Code die ich so nicht brauche, aber die brauche ich später für andere Funktionen, die ich hier der Übersicht halber rausgenommen habe (wegen der Überprüfung ob es sich bei den in den Dateien enthaltenen Wörter um die vom Benutzer gesuchten handelt). So, ich hoffe Du kannst mir helfen. Bine PS: Ist nicht mehr so einfach wie am Anfang, gell?!? Zitieren
Poldi Geschrieben 19. Dezember 2001 Geschrieben 19. Dezember 2001 ich blick den code grad nicht wirklich. wo liest du denn den string in das array ein? beziehungsweise wo löscht du das array? Zitieren
Klotzkopp Geschrieben 20. Dezember 2001 Geschrieben 20. Dezember 2001 <STRONG> /* Falls ich schon eine Datei durchsucht habe, ist nScnt > 0, da ich mit jedem Wort nScnt erhöhe. Folgendes mache ich, damit die Wörter die ich bereits in die index.tmp.txt geschrieben habe (welche ich am ende in index.txt umbenannt habe), auch weiterhin in der Datei stehen, und der Rest nur angehängt wird */ if(nScnt>0) { nD = 2; while(nD!=EOF) { nD = fgetc(FX); szAusgelesenes[0] = nD; fwrite(szAusgelesenes, sizeof(char), 1, FW); } fclose(FW); fclose(FX); FX = fopen(chB, "r"); FW = fopen(chA, "a+"); }[/code]</STRONG> Hier liegt der Fehler. Wenn fgetc EOF (-1) zurückliefert, schreibst Du trotzdem noch ein Zeichen in die Datei. Dabei brichst Du den int, den fgetc geliefert hat, auf einen unsigned char herunter, so dass 255 übrig bleibt, was dem Y mit zwei Punkten entspricht. Besser wäre: while( EOF != ( nD = fgetc(FX) ) ) {... Dann kannst Du Dir auch die Vorbelegung von nD sparen. Ach ja, anstelle von fclose und anschließendem fopen kannst Du auch einfach fseek(FX, 0, SEEK_SET) benutzen. Zitieren
Woodstock Geschrieben 20. Dezember 2001 Autor Geschrieben 20. Dezember 2001 Danke, ich probiere es gleich mal. Ansonsten wünsche ich Euch allen schöne Weihnachten (weil ich hab' morgen auch Schule, und dann frei bis im Januar - Paris ich komme)!!! Bine Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.