Zeichen in einer Textdatei suchen

Hallo

Ich möchte ein Programm schreiben, dass eine Textdatei nach dem Wort START durchsucht und ab diesem Wort alle Zeichen bis ENDE in eine andere Textdatei speichert.

Bisher habe ich es geschafft, eine Datei zu öffnen, die ersten Zeichen zu kopieren und diese in eine neue Datei zu schreiben.

Was ich nun nicht hinbekomme ist das finden des Textes START.

Wäre dankbar über jede Idee.
 
Also mal ganz allgemein würd ich das ungefair so machen:

Erstmal 2 Felder mit den zu suchenden Zeichenketten
und 2 Indizes mit denen du die augenblickliche Stelle
im Feld markierst.
Code:
char start[] ={"START"};
int indS = 0;
char ende[] ={"ENDE"};
int indE = 0;

bool started = false;

Jetzt muss du die Datei zeichenweise einlesen. solange started
noch false ist vergleichst du das eingelesene zeichen mit dem
zeichen was in start[indS] steht. Wenn es nicht übereinstimmt
und der Index != 0 dann musst du ihn wieder zurücksetzen.
Wenn die Zeichen übereinstimmen dann Index erhöhen. Dann
noch überprüfen ob das Ende des Feldes erreicht wurde und wenn
ja started auf true setzen.

jetzt überprüfst du das mit der selben Technik auf ENDE.
Dabei darfst du aber wenn du ein gültiges Zeichen gefunden
hast dies nicht gleich in die Datei schreiben. Erst wenn du ein
ungültiges Zeichen findest schreibst du die Zeichen bis zum
aktuellen index in die Datei und setzt diesen dann wieder auf 0.


Gruß Benny
 
Also ich würde es folgendermaßen machen:

Code:
FILE* pFileOpen = fopen("blabla.txt", "rt"); //hieraus lesen
FILE* pFileWrite = fopen("blub.txt", "wt");  //hierrein schreiben
char acPuffer[2];                            //zum Zeichenlesen
acPuffer[0] = '\0';                          //den puffer leeren
char acTestForThis[] = "HALLO";

while(!feof(pFileOpen)) //solange die Datei nicht zu Ende ist weiterlesen
{
    for(int i=0; i<5; i++)
    {
         fgets(acPuffer[0], 1, pFileOpen); //immer ein Zeichen aus der Datei lesen
         
         if(acPuffer[0] != acTestForThis[i]) break;  //wenn das gelesene Zeichen nicht
                                                     //mit dem i-ten Zeichen übereinstimmt,
                                                     //Schleife beenden
         else if(feof(pFileOpen)) break;       //auch hier prüfen ob die Datei zu Ende ist
    }

    if(i == 5) //wenn i=5 ist heißt das, dass 'HALLO' gefunden wurde
    {
         strcpy(acTestForThis, "ENDE");   //'HALLO' ist abgehakt, jetzt nach 'ENDE' suchen

         //das gleiche Spielchen wie oben, nur zusätzlich die Zeichen kopieren
         while(!feof(pFileOpen))
         {   
               for(int i=0; i<4; i++)
               {
                     fgets(acPuffer[0], 1, pFileOpen);

                     if(acPuffer[0] != acTestForThis[i]) break;
                     else if(feof(pFileOpen)) break;
               }

               if(i == 4)  break;         //'ENDE' wurde gefunden
               else
               {
                     //nicht vergessen wieder um i+1 Zeichen zurückzugehen
                     fpos_t pos;
                     fgetpos(pFileOpen, &pos);    //die aktuelle position des Readers
                     pos -= (i+1);
                     fsetpos(pFileOpen, &pos);    //die neue Position setzen

                     fgets(acPuffer[0], 1, pFileOpen);   //wegen der Pos-änderung nochmal lesen
                     fputs(&acPuffer[0], pFileWrite);    //in die andere Datei kopieren
               }
         }
    }
}

fclose(pFileOpen);
fclose(pFileWrite);

Ich habe diesen Code jetzt nicht getestet, also vlt ist noch der ein oder andere Fehler drin, aber eigentlich müsste das klappen ;)
Bei Fragen einfach melden

mfg WhiteGandalf
 
Du kannst die Datei in einen String einlesen und danach die find_first_of Funktion benutzen. Die scheint mir die kürzeste Lösung für dein Problem zu sein. Weitere Informationen zu der Funktion gibts hier in der MSDN.
Gruß
bastionmancher
 
Hallo
Entschuldigt, dass ich mich erst jetzt wieder melde, aber ich hatte keine Zeit das Programm fortzuführen. Doch nun bin ich wieder dran.

Vielen Dank White Gandalf für die Antwort. Ich habe das auch ausprobiert, doch leider läuft das Programm nicht. Ich habe nun selber ein wenig probiert. Mein Stand sieht nun wie folgt aus:
Ich finde das WOrt wohl in der Datei. Doch leider weiß ich nun nicht wie ich die Zeichen ab dem Wort START bis zum Schlusswort ENDE auslesen kann. Mit fscanf fange ich wieder von vorne an zu lesen. Kann das ausserdem sein, dass fscanf die Leerzeichen gar nicht mit liest?

Hier nun mein aktuelles Programm:
C++:
	FILE* pFileOpen = fopen("open.txt","rt");	//Aus dieser Datei lesen
	FILE* pFileWrite = fopen("write.txt","wt");	//In diese Datei schreiben
	char acPuffer[1];							//zum Zeichen lesen
	acPuffer[0]='\0';							//Puffer leeren
	char acTestForThis[] = "START";
	char text[1];
	text[0]='\0';


	//Kopf der Textdatei erstellen
	//////////////////////////////
	fprintf(pFileWrite,"DATA_BLOCK DB %d\n",m_iDBNr);

		for(int i=0; i<5; i++)
		{
			fgets(acPuffer,1,pFileOpen);
				if(acPuffer[0] = acTestForThis[i])
				{
					NULL;
				}
		}
		fprintf(pFileWrite,"Schleife 1 verlassen\n");


		if(i == 5)								//wenn i==5 ist, heißt das, dass 'HALLO' gefunden wurde
		{
			
			strcpy(acTestForThis, "ENDE");		//'HALLO' ist abgehakt, jetzt nach 'ENDE' suchen
				for(int i=0; i<5; i++)
				{
					//Zeichenkopieren und ausgeben
					fscanf(pFileOpen,"%s",&text);
					
					fprintf(pFileWrite,"%s",text);
					if(acPuffer[0] = acTestForThis[i])
						NULL; 
				}

				if(i==4) 
					NULL;					//'ENDE' wurde gefunden
				else
				{
					fpos_t pos;
					fgetpos(pFileOpen, &pos);	//die aktuelle Position des Readers
					pos -=(i+1);
					fsetpos(pFileOpen, &pos);	//die neue Position setzen

					fgets(acPuffer,1,pFileOpen);	//wg. der Pos.-änderung nochmal lesen
					fputs(&acPuffer[0], pFileWrite);	//in die andere Datei kopieren
				}
		}
	fclose(pFileOpen);
	fclose(pFileWrite);
 
Ich würde es so versuchen:
C++:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

bool strStartsWith(std::string &str, std::string &check)
{
    unsigned int checkLen = check.length();

    if (str.length() < checkLen)
        return false;

    for (unsigned int i=0;i<checkLen;i++)
    {
        if (str[i] != check[i])
            return false;
    }

    return true;
}

bool strEndsWith(std::string &str, std::string &check)
{
    unsigned int strLen = str.length();
    unsigned int checkLen = check.length();

    if (strLen < checkLen)
        return false;

    for (unsigned int i=0;i<checkLen;i++)
    {
        if (str[strLen-i-1] != check[checkLen-i-1])
            return false;
    }

    return true;
}

int main(int argc, char **argv)
{
    if (argc < 3)
        return 1;

    std::ifstream fStreamIn(argv[1]);

    if (!fStreamIn.is_open())
        return 2;

    std::vector<std::string> strList;
    std:string row = "";

    while (std::getline(fStreamIn, row))
        strList.push_back(row);

   /*
    * So, nun haben wir alle Zeilen der Datei in 'strList'.
    * Ich weis grad nicht ob du in der Datei die du ausließt nur eine Zeile hast,
    * deshalb einfach mal mit mehreren Zeilen gemacht
    */

    std::ofstream fStreamOut(argv[2]);

    if (!fStreamOut.is_open())
    {
        strList.clear();
        fStreamIn.close();
        return 3;
    }

    for (unsigned int i=0;i<strList.size();i++)
    {
        if (!strStartsWith(strList[i], "START") || !strEndsWith(strList[i], "END"))
            continue;

        std::string text = strList[i].substr(5, strList[i].length()-9);

        // mach was mit dem text zwischen 'START' und 'END'
        if (!(fStreamOut << text << std::endl))
           std::cout << "Verdammt warum kann ich nicht schreiben" << std::end;
    }

    strList.clear();
    fStreamIn.close();
    fStreamOut.close();

    return 0;
}

Habe es grad mal schnell eingetippt. Kann sein das etwas falsch ist, vor allen dingen
bei der Funktion 'strEndsWith' bin ich mir nicht sicher.

Best wishes
FBIagent
 
Zuletzt bearbeitet:
Hallo
Ich habe nun den Code eingegeben doch leider bekomme ich noch die Fehlermeldung
c1083: Include Datei "vector.h" kann nicht geöffnet werden weg.

Folgende Header-Dateien rufe ich nun auch:
C++:
#include "stdafx.h"
#include "fstream.h"
#include <iostream.h>
#include <string.h>
#include <vector.h>

Wie bekomme ich nun diesen Fehler weg?
 
Zuletzt bearbeitet:
Zurück