Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe - bitte, bevor ich durchdrehe (gerne auch gegen geld)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
04.08.2004, 13:23 Uhr
~null_kenntins
Gast


sorry bin heute wohl am pennen
dir is ja schon sehr gut geholfen worden hab irgendwie nicht richtig gelesen oder wohl überlesen
sorry
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
04.08.2004, 14:00 Uhr
~gastmann
Gast



Zitat von virtual:
Na, das ist doch schon was.

Also zunächstmal ist für Dein Problem nicht notwendig, groß im Speicher rumzufuhrwerken: Du liest am besten einfach die Daten, machst die Ersetzung on the fly und schreibst direkt. Allesandere ist ekelhaftes Gemurkse, wenn Du noch nicht so viel mit C gemacht hast.

Also etwa so:

C++:
#include <stdio.h>
#include <string.h>

int main() {
    char* eingabedatei = "datei1.txt";
    char* ausgabedatei = "datei2.txt";
    char* suchtext = "Datum";
    char* ersetzung = "\nDatum";
    FILE* rein;
    FILE* raus;
    char buffer[1024]; /* Wir nehmen mal vereinfachend an, daß eine Textzeile nicht länger als 1023 Zeichen sein kann */
    size_t len;
    char* p1;
    char* p2;


    /* Dateien öffnen */
    rein = fopen(eingabedatei, "r");
    if (rein==NULL) {
        fprintf(stderr, "Kann %s nicht lesen.\n", eingabedatei);
        return 1;
    }
    raus = fopen(ausgabedatei, "w");
    if (raus==NULL) {
        fclose(rein);
        fprintf(stderr, "Kann %s nicht schreiben.\n", ausgabedatei);
        return 2;
    }

    /* Lesen + ersetzen + schreiben */
    while(fgets(buffer, sizeof(buffer), rein)) {
        p1 = buffer;
        while ((p2=strstr(p1, suchtext))!=NULL)
        {
            fwrite(p1, 1, p2-p1, raus);
            fwrite(ersetzung, 1, strlen(ersetzung), raus);
            p1 = p2+strlen(suchtext);
        }
        if (*p1) fwrite(p1, 1, strlen(p1), raus);
    }

    fclose(raus);
    fclose(rein);
}





geil - genau, soweit klappt das - wo ich noch nicht dran gedacht hatte, ist dass man
dies über die hilfsvariablen machen muss.
mit dieser while-schleife kann ich aber jetzt kein zweites such-kriterium in der gleichen zeile abarbeiten
also wenn ich z.b. zusätzlich in der zeile noch folgendes hätte:
char* suchtext2 = "Uhrzeit";
char* ersetzung2 = "\nUhrzeit";

definiere.
hier fehlt mir nun die logik, oder gibt es sowas wie
while ((p2=strstr(p1, suchtext))!=NULL) ODER ((p2=strstr(p1, suchtext2))!=NULL)
bei suchtext mach dies
bei suchtext2 mach dies

hatte gestern nur 2 stunden schlaf deswegen und jetzt hast du mich wieder motivieren können - sonst wär ich wirklich durchgedreht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
04.08.2004, 14:09 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


virtuals schleife geht den kompletten text durch und falls ein wort mehrmals in einer zeile vorkommt wird es auch mehrmals ersetzt...
du könntest z.b. erst einmal die schleife durchlaufen lassen mit dem einen suchtext... und danach die nochmal mit dem anderen suchtext (in dem falle ist dann vorischt geboten, weil du könntest ja erst "hallo" durch "testy" ersetzen und danach dann "test" durch "sex" was dann zur folge hätte das nicht nur da wo vorher test stand sex steht und da wo vorher hallo stand sexy steht...

ach so in dem falle dann nicht gleich in die datei schreiben sondern erst im buffer rummüllen... problem was du dabei bekommen kannst ist das der buffer zu klein werden kann...

vielleicht hilft dir diese funktion dabei

C++:
int ersetzen(char *such, char *neu, char **inp,int *inp_l){
int offset,x=strlen(neu),y=strlen(such),z=strlen(*inp),rv=0;
char *str,*tmp;

    while(str=strstr(*inp,such)){ //substring such im string *inp suchen
        ++rv;                    //inkrementieren der anzahl der gefundenen ersetzungen
        z+=x-y;                    //neue zeichenanzahl von *inp errechnen                    

        if(*inp_l<=z){            //wenn *inp nicht gross genu
            offset=str-*inp;    //offset merken
            tmp=(char*)realloc(*inp,sizeof(char)*(z+1));    //feld entsprechneder grösse allokieren
            if(tmp){*inp=tmp;*inp_l=z+1;str=*inp+offset;}    //ursprungszustand der zeiger herstellen
            else return -1;
        }
            
           memmove(str+x,str+y,sizeof(char)*strlen(str+y-1));    //werte im array nach dem zu ersetzenden verschieben
        memcpy(str,neu,sizeof(char)*x);                        //neu zeichenfolge in *inp kopieren
        
    }

    return rv; //fertisch
}




--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 04.08.2004 um 14:12 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
04.08.2004, 14:16 Uhr
~gastmann
Gast


jetzt hab ichs

anstelle von
while ((p2=strstr(p1, suchtext))!=NULL)

einfach
if((p2=strstr(p1, suchtext))!=NULL)
{}
und
if((p2=strstr(p1, suchtext2))!=NULL)
{}

und so weiter


oder mach ich nen denkfehler?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
04.08.2004, 14:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


öhm ja ist ein denkfehler weil die schleife wird ja nur durchlaufen wenn er suchtext findet und nicht suchtext2....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
04.08.2004, 14:49 Uhr
~gastmann
Gast



C++:

    char* eingabedatei = "c:\\datei.txt";
    char* ausgabedatei = "c:\\datei2.txt";
    char* suchtext = "Wort1:";
    char* ersetzung = "\nWort1:";

    char* suchtext2 ="Wort2:";
    char* ersetzung2="\nWort2:";
    char* suchtext3 ="Datum:";
    char* ersetzung3="\nDatum";

    


    FILE* rein;
    FILE* raus;
    char buffer[1024]; /* Wir nehmen mal vereinfachend an, daß eine Textzeile nicht länger als 1023 Zeichen sein kann */
    size_t len;
    char* p1;
    char* p2;


    /* Dateien öffnen */
    rein = fopen(eingabedatei, "r");
    if (rein==NULL) {
        fprintf(stderr, "Kann %s nicht lesen.\n", eingabedatei);
        return 1;
    }
    raus = fopen(ausgabedatei, "w");
    if (raus==NULL) {
        fclose(rein);
        fprintf(stderr, "Kann %s nicht schreiben.\n", ausgabedatei);
        return 2;
    }

    /* Lesen + ersetzen + schreiben */
      while(fgets(buffer, sizeof(buffer), rein))
    
      {
        p1 = buffer;
       // while ((p2=strstr(p1, suchtext))!=NULL)
            if((p2=strstr(p1, suchtext))!=NULL)
        {
            fwrite(p1, 1, p2-p1, raus);
            fwrite(ersetzung, 1, strlen(ersetzung), raus);
            p1 = p2+strlen(suchtext);
        }
    if((p2=strstr(p1, suchtext2))!=NULL)
        {
            fwrite(p1, 1, p2-p1, raus);
            fwrite(ersetzung2, 1, strlen(ersetzung2), raus);
            p1 = p2+strlen(suchtext2);
        }
    if((p2=strstr(p1, suchtext3))!=NULL)
        {
            fwrite(p1, 1, p2-p1, raus);
            fwrite(ersetzung3, 1, strlen(ersetzung3), raus);
            p1 = p2+strlen(suchtext3);
        }

        if (*p1) fwrite(p1, 1, strlen(p1), raus);



    }

    fclose(raus);
    fclose(rein);
    system("copy c:\\datei2.txt c:\\datei.txt");
    system("del  c:\\datei2.txt");




so funktionierts einwandfrei - verstehe nicht, warum ich nu nen denkfehler mache - habs probiert und meine datei wird perfekt umgeschrieben.
sogar, wenn suchtext, suchtext1 und suchtext2 in einer zeile steht.
hatte jetzt auch keinen error - wirklich ne geile sache.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
04.08.2004, 14:50 Uhr
~gastmann
Gast


bin jetzt für sämtliche belehrungen offen - so ein erfolgserlebnis hatte ich nämlich die letzten 20 stunden mit dieser datei nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
04.08.2004, 15:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


funktionieren tuts in deinem fall nur in ein paar spezialfällen...
vermutlich stehen bei dir was in dem was du probiert hast suchtext suchtext2 und suchtext 3 hintereinander...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
05.08.2004, 10:52 Uhr
0xdeadbeef
Gott
(Operator)


Heh. Da hab ich mal ne Chance, dreckigen Code zu schreiben

C++:
#include <stdio.h>

int main(int argc, char *argv[]) {
  FILE *in;
  int ix = 0, i;
  char c;

  in = fopen(argv[1], "r");

  while(!feof(in)) {
    c = fgetc(in);
    if(ix == sizeof("Datum") - 1) {
      printf("\nDatum");
      ix = 0;
      putchar(c);
    } else if(c == "Datum"[ix]) {
      ++ix;
    } else{
      for(i = 0; i < ix; ++i)
        putchar("Datum"[i]);
      ix = 0;
      putchar(c);
    }
  }

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
05.08.2004, 11:22 Uhr
virtual
Sexiest Bit alive
(Operator)


@beefy
Du bist krank.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: