Zum Inhalt springen

Komisches Zeichen vor Ausgelesenem!!!


Woodstock

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?!?

Link zu diesem Kommentar
Auf anderen Seiten teilen

<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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...