Textausgabe: Zeichen '|' bei Zeilenumbruch

lindin

Erfahrenes Mitglied
Ich brauch mal wieder Hilfe!

Ich gebe Text in einer Dialog-Resource aus!

Den Text hole ich mir aus einer Datei!

Der Text beinhaltet auch Zeitinformationen welche ich folgendermaßen in die Datei schreibe:

Code:
time ( &rawtime );
timeinfo = localtime ( &rawtime );
sprintf(Zeit,"Text\x0D\x0A Start des Kontakts:   %sText\x0D\x0A", asctime(timeinfo));
fprintf ( fp,Zeit);

Wenn ich jetzt den Text wieder auslese, und in einem Fenster ausgebe, dann wird hinter die Zeit immer das Zeichen '|' gesetzt...

Weiß jemand, woran das liegt, und wie ich das verhindern kann?
 
Hm, aslo jetzt muß ich doch nochmal fragen:

habe das Problem folgendermaßen gelöst:

Code:
if (ptr = strstr(buf, "\x0A"))!=NULL){
	 *ptr = '\x0D';
	  ptr = ptr+1;
	  *ptr = '\x0A';
}

Wenn ich das aber bei einem ganzen Text machen will, funktioniert das ganze natürlich nicht mehr...

Denn wenn ich jetzt eine While-Schleife über den Text laufen lasse, kommt der Pointer natürlich immer wieder bei dem ersten "\x0A" an, und so stürzt das ganze ab!

Nun habe ich es folgendermaßen versucht:

Code:
while (((ptr = strstr(buf, "\x0A"))!=NULL)&&(ptr2=ptr-1)!="\x0D"){
	 *ptr = '\x0D';
	ptr = ptr+1;
	 *ptr = '\x0A';
}

DA ja, das schon bearbeitete '\x0A' dann schon ein vorangehendes "\x0D" haben müßte, aber das funktioniert auch nicht, stürzt genauso ab!

Kann mir jemand weiterhelfen?
ICh hoffe, das ist verständlich ausgedrückt hier...
 
Zuletzt bearbeitet:
Also ich denke, es liegt daran, daß das erste Zeichen in buf schon ein '\x0A' ist, und ptr2 dann auf einen falschen Speicherbereich zeigt!

(ptr zeigt auf das erste Zeichen, ptr2=ptr-1!)
 
Und jetzt ist mir noch das nächste Problem eingefallen, '\x0D' wird ja nicht eingefügt, sonder das Byte wird ja nur ersetzt... nu muß ich mir wohl doch noch was neues einfallen lassen...
 
Meine Idee: Eine Klasse, die das Einlesen und speichern managed. Die enthält dann einen std::vector für sowohl Zeit als auch Text (gleicher Index gehört zusammen). (Oder ist nicht genau eine Zeit genau einem Text zugeordnet? Ich verstehe ehrlichgesagt die Art und Weise nicht, wie du in die Datei schreibst.)
Für die Textdatei gehst du so vor: Öffnen und komplett in den Speicher lesen. Der Puffer, den du jetzt erhalten hast, wird dann von vorne nach hinten geparst, bis ein Zeilenumbruch erfolgt (0x0D). Der Teilstring vom letzten Umbruch (oder 0) bis zum neuen gefundenen Umbruch wird dann in die std::vector Variable eingetragen, je nachdem ob es eine Zeit oder ein Text war.

P.S.: Was versuchst du eigentlich mit der ganzen Pointerarrithmetik zu erreichen? So wie ich das sehe überschreibst du die ganze Zeit den Text mit 0x0A und 0x0D bis du zum ersten Zeilenumbruch kommst. Warum? Hab ich dein Problem falsch verstanden?
 
Also ...
Code:
if (Bedingung){
            
          char *subtext = (char*)malloc(sizeof(char)*(strlen(buffer)+50));
          g=strlen(buffer);
          ptr=buffer;
          ptr2=subtext;
          for(v=0;v<=g;v++){
	if (*ptr=='\x0A') {
                              *ptr2='\x0D';
	         ptr2=ptr2++;
	         *ptr2='\x0A';
	           ptr2=ptr2++;
					 
	}
	else {
	         *ptr2=*ptr;
	         ptr2=ptr2++;
	}
	ptr=ptr++;
         }
}

So funktioniert es jetzt!

Wieso überschreibe ich den ganzen Text?
Und wie soll man das ohne Pointerarithmetik hinkriegen?
 
Na weil du ptr auf buffer gesetzt hast. Beide zeigten dann auf die selbe Adresse, so dass du mit ptr den Speicher veränderst auf den auch buffer zeigt (das ist doch das Prinzip von Zeigern). So geht's jetzt aber, jetzt manipulierst du ja nur subtext.
Jetzt verstehe ich auch, was der Code macht. Du fügst einfach ein Zeichen ein. Es empfiehlt sich vielleicht den Text vorher mal durchzusuchen, damit du auch die richtige Menge speicher reservierst. So bist du ja auf 50 Zeilen beschränkt. Reicht es eigentlich, wenn du einen nun prinzipiell genauso unstrukturierten Text hast wie vorher? Wär es nicht sinnvollen, wenn du den Text Zeilenweise in ein Array einlesen würdest?

(Kleiner Hinweis: ptr2++; alleine reicht schon aus, du brauchst das nicht noch sich selbst zuweisen (also nicht ptr2 = ptr2++; ).)
 
Das hatte ich mir auch schon überlegt, daß ich vorher den Text durchlaufe, um die Anzahl der zusätzlich zu allokierenden Bytes hersuazufinden!

Jedoch hatte ich schon einmal Probleme damit, Speicher mit einer noch nicht vorher festgelegten Größe zu allokieren...
Code:
char *subtext = (char*)malloc(sizeof(char)*(strlen(buffer)+Anzahl));

Hier wäre ja Anzahl erst zur Laufzeit definiert, und sowas in der Art hat Visual C++ bei mir schon mal angemeckert!

WAs heißt denn, der Text sei dann unstrukturiert Ist doch im Prinzip genau der gleiche Text wie vorher!
 
strlen(buffer) wird auch erst zur Laufzeit definiert. Ist ja sogar der Rückgabewert einer Funktion.
Code:
int anzahl = 0;
for (int i = 0; i < strlen(buffer); i++) if (buffer[i] == 0x0A) anzahl++;

char *subtext = (char*)malloc(sizeof(char)*(strlen(buffer)+anzahl+1));

Das dürfte gehen. Ach ja, die +1 ist für das abschließende 0-Zeichen, das von strlen nicht berücksichtigt wird. Das kopierst du derzeit auch nicht mit, musst es aber auf jeden Fall noch erledigen. Füge am besten noch folgende Zeile direkt nach der Deklaration von subtext ein:

Code:
 memset(subtext,0,sizeof(char)*(strlen(buffer)+anzahl+1));

Dann ist der String auf jeden Fall 0-terminiert.

Mit "unstrukturiert" meine ich eben das, dass er eben noch genauso ist wie vorher, mit einem solchen Text kann man nur ganz ungemütlich arbeiten. Wenn du ihn zeilenweise speicherst, hast du eine wesentlich übersichtlichere Struktur.
 

Neue Beiträge

Zurück