HILFE: ganze textblöcke(zeilen) in einer txt-datei verschieben

enterbreak

Grünschnabel
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:

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):

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 das auch bestimmt hier passend für das tutorial-forum passen würde 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");
 
hi,

was macht bzero?
ist das eine funktion?
wo lege ich am besten bezug1 und bezug2 fest?
schon über folgendes direkt im main , oder?
char* bezug1 = "Bezug1######:";
char* bezug2 = "Bezug2######:";
 
Zuletzt bearbeitet:
Code:
      1 #include <iostream>
      2 #include <string>
      3 #include <fstream>
      4 
      5 using namespace std;
      6 
      7 int main(){
      8 
      9         char *row = new char[2048];
     10         bzero(row, sizeof(row));
     11         ifstream in("Test.txt");
     12         ofstream out("Test.txt", ios::trunc);
     13 
     14         string::size_type paste_pos= 0, cut_pos1 = 0, cut_pos2 = 0;
     15 
     16         string content = "";
     17         while(!in.eof()){  // gesamten content in string lesen
     18                 in.getline(row, 2048);
     19                 content = content + row + "\n";
     20         }
     21         in.close();
     22 
     23         //string bearbeitung
     24         // Solange string bearbeiten bis kein "von:" mehr vorhanden
     25         while((paste_pos = content.find("von:", paste_pos)) != string::npos){    
     26                 string subtext = ""; 
     27                 paste_pos = content.find("\n", paste_pos);
     28                 cut_pos1 = content.find("\n", content.find("bezug1", paste_pos));
     29                 cut_pos2 = content.find("bezug2", cut_pos1);
     30                 subtext = content.substr(cut_pos1 + 1, cut_pos2 - cut_pos1 - 1);
     31                 content = content.erase(cut_pos1 + 1, cut_pos2 - cut_pos1 - 1); 
     32                 content.insert(paste_pos+1, subtext); 
     33         }
     34                 
     35         //string zurück in Datei schreiben
     36         
     37         out << content;      
     38         out.close();         
     39         return 1;
     40 }
Sorry hatte den Code ausversehen beim editieren gelöscht...

Ja bzero füllt den char *row einfach mit Nullen auf..
 
Ja du kannst es nat auch so machen
const char bezug1[] = "bezug1";
const char bezug1[] = "bezug2";

Und dann im find die entsprechende bezug1 bzw bezug2 verwenden..

Gruß

RedWing
 
bzero is nur dafür gedacht row mit 0en aufzufüllen...
Allerdings weiß ich nihct (wenn du mit windows programmierst),
ob es die Funktion da gibt... Ich hab den COde unter Linux geschrieben...

Gruß

RedWing

P.S. Der Code liest die komplette Datei vorher ein du müsstest ihn vielleicht noch
umändern, so das du nur bis "bezug2" oder so einlesen solltest und dann den String
bearbeiten solltest und ihn wieder zurück schreibst...

Gruß

RedWing
 
bzero hab ich jetzt mal rausgenommen, muss denke ich nicht sein.

trotzdem bekomm ich leider nur eine leere txt-datei als resultat.
 
Lass dir den content einfach mal vorher ausgeben bzw debug mal durch...
Vielleicht schaut deine Textdatei ja doch anders aus?
Hab mich bei der Implementierung an dein Beispiel gehalten...

Gruß

RedWing
 

Neue Beiträge

Zurück