Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » HILFE: ganze textblöcke(zeilen) in einer txt-datei verschieben

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 ]
000
04.10.2004, 20:07 Uhr
enter-break



Hallo,

auch nach langer Suche im forum hab ich leider noch keinen annähernden lösungsansatz gefunden und ich schaff das alleine irgendwie nicht.
hat jemand eine funktion, um ganze text-blöcke in einer txt-datei an eine bestimmte stelle nach oben zu verschieben?

mal ein beispiel, wie's in meiner txt-datei aussieht:


Code:


von: text@blalbalba
zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
bezug1####################
ölaskdöjflkadsöflkasdfökasjdf
ölaksdfölaskdöflkajsdölkfajsödlfj
ölaksdfölaksdfölk
bezug2####################
blablalba
zeile irgendwas
und
so weiter

von: text@blalbalba222
zeile 1
zeile 2
zeile 3
zeile 4
bezug1####################
sssdddddddddddddd3eeeeeeeeeeeee
opiu0o09898709870987
lkjölkjölkölkj
32132321323232321
bezug2####################
blablalba
zeile irgendwas
und
so weiter



nun soll es so aussehen, dass die zeilen zwischen bezug1 und bezug2 nach oben verschoben wird in die zeile direkt nach von:

also soll die textdatei so aussehen (anhand des obigen beispiels):

Code:
von: text@blalbalba
ölaskdöjflkadsöflkasdfökasjdf
ölaksdfölaskdöflkajsdölkfajsödlfj
ölaksdfölaksdfölk
zeile 1
zeile 2
zeile 3
zeile 4
zeile 5
zeile 6
zeile 7
bezug1####################
bezug2####################
blablalba
zeile irgendwas
und
so weiter

von: text@blalbalba222
sssdddddddddddddd3eeeeeeeeeeeee
opiu0o09898709870987
lkjölkjölkölkj
32132321323232321
zeile 1
zeile 2
zeile 3
zeile 4
bezug1####################
bezug2####################
blablalba
zeile irgendwas
und
so weiter



alles was ich hab, sind 3 konstante (von: , bezug1, bezug2) mit denen ich arbeiten kann - die zeile würde ich ja über strncmp noch finden, doch
wie mache ich dann weiter???
wenn ich zeilenweise einlese, bin ich ja bereits viel zu weit unten, um dann oben die zeile einzufügen zu können.
Wie könnte die lösung aussehen??
gibt es hierfür vielleicht funktionen?

meine idee war zuerst, irgendwie die komplette datei in den speicher zu laden - allerdings könnte die u.Umständen auch gerne mal 20 MB groß sein was sicher zu Speicherproblemen führen könnte.

bitte bitte helft mir schnell - bin mir sicher, für euch profis ist das ein Leichtes.

achso - hätt ich fast vergessen, soweit wär ich schon - nun weiss ich aber nicht mehr weiter, denn ich habe mich noch nicht so ganz in c eingearbeitet und hoffe euch einen beispiel-code zu entlocken....



Code:


#include <ctype.h>
#include <stdlib.h>
#include <conio.h>

#include <stdio.h>
#include <string.h>
int main ()
{
    char* eingabedatei = "eingabe.txt";
    char* ausgabedatei = "eingabe2.txt";
    
    char* schiebevon = "Bezug1######:"; // zwischen dieser zeile
      char* schiebebis    = "Bezug2####";    // und dieser zeile
         char* nachzeile    = "Von: ";         // eine zeile NACH dieser zeile einfügen

    FILE* rein;
    FILE* raus;
    char buffer[5000];
    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 + verschieben + im speicher um-schreiben */
      while(fgets(buffer, sizeof(buffer), rein))
            {
        p1 = buffer;
       // while ((p2=strstr(p1, schiebevon))!=NULL)
          if((p2=strstr(p1, schiebevon))!=NULL) // if ist wohl besser, oder?
        {
           //
           //    H I L F E E E E
           //

        }
           }

    fclose(raus);
    fclose(rein);
    system("copy c:\\eingabe2.txt c:\\eingabe.txt");
    system("del  c:\\eingabe2.txt");

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.10.2004, 20:26 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


erste frage... muss es c sein oder geht auch c++?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.10.2004, 20:29 Uhr
enter-break



sollte schon c sein
kannst du das?

oder kannst du sowas auch in c++ lösen (davon hab ich allerdings von viel weniger ahnung (zumindes bis jetzt) und wäre für eine lösung auch dankbar)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.10.2004, 20:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also in c muss man sich schon ein wenig mehr mit rumärgern...
mit c++ ists recht einfach da man sich nicht mit der speicherallokierei beschäftigen muss...

ich such mal im forum da war glaub ich schon mehr oder weniger ein fertiges beispiel für sowas, wo man nur noch ein wenig auf deinen fall anpassen muss...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.10.2004, 20:52 Uhr
enter-break



hi windalf,
das wär echt genial - postest du hier kurz, was man noch anpassen muss??
(nun hab ich mich hoffentlich die letzten tage nicht umsonst in c eingelesen, war schon ein teufelszeugs überhaupt zeilenweise einlesen zu können *grr*)

c++ ist aber bestimmt vernünftiger für die zukunft, und sicher aktueller oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.10.2004, 21:03 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


so hab mal schnell ein einfaches beispiel zusammengehackt...
im moment wird nur eine datei komplett ausgelesen und dann in eine andere das ganze spass wieder reingeschrieben...
die daten sind zeilenweise in einem array (std:vector-objekt) gespeichert... du kannst damit genauso arbeiten wie mit einem array ist nur noch ein wenig mächtiger... und du musst dich nicht um die rumallokiererei kümmern. macht das teil alles von selbst...


C++:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::string line; //ein zeile
    std::vector<std::string> file; //in diesem array wird die datei eingelesen die erste zeile steht dann in file[0] die zweite in file[1] usw...
    
    std::ifstream ifs("test.txt"); //datei zum lesen öffnen
    while(std::getline(ifs,line)) //so lange noch was in der datei zum einlesen ist
        file.push_back(line); //füge die zeile in das array ein
    ifs.close(); //datei schliessen

//hierm müsstest du dann deine spielereien mit dem vertauschen machen... das überlass ich mal erstmal dir... beschäftige dich mal mit std::vector und std::string da gibts schon methoden die dir die arbeit vereinfachen... das was du dann machen musst ist vermutlich nur ein dreizeiler...

//hier wird das was in file steht wieder in ne datei geschrieben... wenn du file entsprechend modifziert hast steht dann das drin was du willst im moment ist es halt nur ne 1:1 kopie
    std::ofstream ofs("test2.txt");
    std::copy(file.begin(), file.end(), std::ostream_iterator<std::string>(ofs, "\n"));
    ofs.close();

//das hier nur mal so falls mal ausgeben willst was aktuell in deinem array file drin steht...
    std::copy(file.begin(), file.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.10.2004, 21:18 Uhr
enter-break



hi nochmal,

ach du grüne neune - da hauts mich ja gleich vom stuhl hier.
das mit dem noch fehlenden "3zeiler" werd ich wohl mit 2-3 tagen
verständnisfragen und leserei/lernerei verbringen müssen, bis
ich rausgefunden hab, was std::vector und std::string macht (und ich muss bis morgen abend fertig sein :-((( )

vielleicht schonmal nen tipp für mich, wie ich nun in dem array
meinen string bezug1 und bezug2 (und vor allem die zeilen dazwischen)
finde und dann "verschiebe"?


noch ne frage hab ich vorab schonmal:
wie groß darf ein array maximal sein??
wenn ich das jetzt soweit richtig verstanden hab, steht dann in dem array
am ende die komplette txt-datei drin, und man arbeitet dann damit weiter.
-> gehen da auch mal 20-30 MB textdateien??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.10.2004, 21:38 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ok dann geb ich dir nochmal ein tipp...


C++:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
    std::string line;
    std::string keyword1="bezug1";
    std::string keyword2="bezug2";
    std::vector<std::string> file;
    std::vector<std::string>::iterator i;
    std::vector<std::string>::iterator j;

    
    std::ifstream ifs("test.txt");
    while(std::getline(ifs,line))
        file.push_back(line);
    ifs.close();
//suchen nach keyword1...  i zeigt am ende auf die stelle von keyword 1 oder es ist ganz durchgerauscht wenn es keyword1 nicht finden konnte
    for(i=file.begin();i!=file.end() && std::string::npos==i->find(keyword1);++i);
//suchen nach keyword2 j zeigt am ende auf die stelle von keyword2 oder es ist ganz durchgerauscht wenn es keyword2 nicht finden konnte
    for(j=++i;j!=file.end() && std::string::npos==j->find(keyword2);++j);
//zum checken mal ausgeben was man so bisher zwischen j und i gefunden hat...
//wenns passt einfach nur noch die zeilen an den anfang des arrays kopieren und jeweil löschen...
    std::copy(i, j, std::ostream_iterator<std::string>(std::cout, "\n"));
    



ach so ja grössere dateien sind auch kein probelm wenn du genug ram im speicher hast... an sonsten fängt der an auszulagern und das dauert dann entsprechend länger muss aber vom prinzip her gehen...


Bearbeitung:

ach so vielliecht mal hier drauf nen blick werfen www.sgi.com/tech/stl/

oh gott "wenn du genug ram im speicher hast"... wenn das nicht mal die aussage des monats wird


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

Dieser Post wurde am 05.10.2004 um 01:23 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.10.2004, 21:48 Uhr
(un)wissender
Niveauwart


Hey Windalf, solltest du das Programmieren endliche gelernt haben oder war das nur abgeguckt.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.10.2004, 21:55 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Hey Windalf, solltest du das Programmieren endliche gelernt haben oder war das nur abgeguckt


wie was abgeguckt... das ist doch wohl wesentlich einfach so als das im c-style zu machen, abgucken brauch man da ja nicht viel das geht mir so mitlerweile gut von hand... das würde ich höchstens aus sportlichen ehrgeiz in c probieren...
Hausaufgabe für (un)wissender: Schreibe das programm in c
--
...fleißig wie zwei Weißbrote
 
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: