Daten in textdatei speichern

marcosan

Mitglied
Hallo Community

Ich hoffe, es finden sich einige, die mir bei meinem Problem hier etwas weiterhelfen können.

Ziel ist es, Daten die von einem Scanner kommen, in ein Text File zu speichern. Datensatz um Datensatz. Die Funktion funktioniert soweit, das Problem vermute ich bei der von mir erstellten Speicherung der Daten.
Folgende Probleme habe ich beim unten angefügten Code.

1. Text „anfügen“
Der vom Scanner eingelesene Text wird zwar in der Datei gespeichert, er überschreibt aber den alten Inhalt. Eigentlich sollte der Text auf einer neuen Zeile im Textfile angefügt werden.

2. dynamische Länge der Daten die eingelesen werden.
WriteFile (hFile,g_pszTextLabel,20,&Readd, NULL); die 20 sollte durch den dynamischen Wert in nTextLength ersetzt warden. Setze ich nTextLength anstelle der 20 ein, so wird nur 50% der Daten in g_pszTextLabel gespeichert.

3. Zeinenumbrüche
Ich würde gerne in einem String einen Zeilenumbruch in die Textdatei speichern. Aber weder \n noch andere Formatierungen die mir bekannt sind, scheinen zu gehen.

C++:
void ThisProgram_UpdateTextLabel(void)
{
HANDLE hFile;
DWORD Readd;
hFile = CreateFile(_T("/My Documents/test.txt"), 
			GENERIC_WRITE, 0, NULL, 
			OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // File erstellen

	g_bNewCode = true;
		
	ThisProgram_DeinitTextLabel();

	//Datem vom Scanner empfangen
	size_t nTextLength = g_oScanner.getLabelTextLength();

	if (nTextLength>0)
	{
		g_pszTextLabel = new TCHAR [nTextLength+1];
		if (g_pszTextLabel != NULL)
		{
			g_oScanner.getLabelText(g_pszTextLabel, nTextLength);
			g_pszTextLabel[nTextLength] = _T('\0');
			// Daten in Datei speichern			
			WriteFile (hFile,g_pszTextLabel,20,&Readd, NULL);  
// Statischer WERT 20 durch dynamischen ersetzen
		}
	}
// Speicherfile schliessen
CloseHandle (hFile);
}

Das Gerät auf dem das Programm laufen wird findet man hier:
http://www.datalogic.de/_vti_g2_p_det.aspx?idp=e7a3ea6d-c1b8-40ed-bfda-9009003187ac&rpstry=17_

Sind zwar gleich 3 Fragen auf einmal, bin aber für jeden Hinweis froh, der mich etwas weiterbringt bei meinem kleinen Programm.
 
Zuletzt bearbeitet:
Hallo marcosan, willkommen auf tutorials.de!

Zuerst einmal: Kannst du bitte Code den du postest mit den entsprechenden Code Tags versehen, so ist er deutlich besser lesbar. (C Code in [c]...[/c], C++ Code in [code=cpp]...[/code] Tags usw.) (Du kannst deinen Text auch noch bearbeiten!)

marcosan hat gesagt.:
1. Text „anfügen“
Der vom Scanner eingelesene Text wird zwar in der Datei gespeichert, er überschreibt aber den alten Inhalt. Eigentlich sollte der Text auf einer neuen Zeile im Textfile angefügt werden.
Du mußt die Funktion SetFilePointer verwenden um den Dateizeiger zum Ende der Datei zu bewegen bevor du anfängst zu schreiben.

marcosan hat gesagt.:
2. dynamische Länge der Daten die eingelesen werden.
WriteFile (hFile,g_pszTextLabel,20,&Readd, NULL); die 20 sollte durch den dynamischen Wert in nTextLength ersetzt warden. Setze ich nTextLength anstelle der 20 ein, so wird nur 50% der Daten in g_pszTextLabel gespeichert.
Je nachdem was für ein Typ TCHAR wirklich ist (TCHAR ist nur ein Makro) sind die Zeichen unterschiedlich groß (z.B. wenn ein Multibyte Zeichensatz verwendet wird oder nicht). Um die Größe (in Bytes!) deines Strings zu ermitteln mußt du die Anzahl der Zeichen mit der Größe eines einzelnen Zeichens multiplizieren.

marcosan hat gesagt.:
3. Zeinenumbrüche
Ich würde gerne in einem String einen Zeilenumbruch in die Textdatei speichern. Aber weder \n noch andere Formatierungen die mir bekannt sind, scheinen zu gehen.
Das sollte eigentlich funktionieren. Zeig mal den Code dazu.

Gruß
 
Danke deepthroat für deine Tipps und die Begrüssung im Forum.
Bin zwar schon etwas länger Mitglied hier im Forum, bisher wurden meine "Fragen" aber meistens durch die Suchfunktion gelöst. :suchen:

Konnte die Antworten bisher noch nicht selber überprüfen, das SetFilePointer sieht aber vielversprechend aus. Danke für den Link.

Zu Punkt 2. Da werde ich mich wohl noch weiter in C++ einlesen müssen. Sollte so aber auch zu lösen sein.

Zu Punkt 3. Komme gerade nicht an meinen Code, werde das dann aber bei Gelegenheit mal posten.
 
Du solltest dir auch angewöhnen, das Betriebsystem zu erwähnen auf dem du programmierst. Deine Lösung mit WriteFile zB ist rein für Windows gültig. Ich hätte das auch eher mit den Standard Streams von cpp gemacht. Du solltest gerade als Anfänger zu Begin möglichst viel mit reinem Standard Cpp programmieren. Mit Streams könnte das so ausehen (in der Form musst du auch nicht immer wieder das Ende der Datei suchen, wenn du den Stream nicht schließt:
C++:
#include <iostream>
#include <fsstream>

// *snipp*

void DeinProgram(void) {
    ofstream out("test.txt");

  // *snipp* dein Scanner Code

    out << "Hier kommt dein Daten/Textstring" << endl;

}
 
Zuletzt bearbeitet:
Du solltest dir auch angewöhnen, das Betriebsystem zu erwähnen auf dem du programmierst.
Stimmt, habe ich vergessen anzugeben.
Entwicklungsumgebung ist: eMbedded Visual C++ 4.0 auf WinXP
Betriebssystem auf dem das Programm laufen wird ist: Windows CE 5.0 (Gerät habe ich im ersten Posting verlinkt)

Deine Lösung mit WriteFile zB ist rein für Windows gültig. Ich hätte das auch eher mit den Standard Streams von cpp gemacht. Du solltest gerade als Anfänger zu Begin möglichst viel mit reinem Standard Cpp programmieren.
Ich weiss das WriteFile rein für Windows ist. Mein Problem ist, die vorgegebene Entwicklungsumgebung für Win CE will Streams nicht unterstützen, bzw. kenn sie einfach nicht.
 
Bin noch etwas Code schuldig...

C++:
	char demotext[17];
	demotext[0] = 't';
	demotext[1] = 'e';
	demotext[2] = 's';
	demotext[3] = 't';
	demotext[4] = '\n';
	demotext[5] = 't';
	demotext[6] = 'e';
	demotext[7] = 's';
	demotext[8] = 't';
	demotext[9] = 'k';
	demotext[10] = 'u';
	demotext[11] = '0';
	demotext[12] = '0';
	demotext[13] = '0';
	demotext[14] = 'A';
	demotext[15] = '\n';
	demotext[16] = '\0';
Und geschrieben wird dann mit
C++:
WriteFile (hFile,demotext,sizeof(demotext),&Readd, NULL);
Für \n sehe ich im Text File dann nur ein 4-Eck.
 
Hi.

Da du ja die Low-Level Funktionen benutzt mußt du statt eines einfachen LF (LineFeed) das unter Windows übliche CRLF für ein Zeilenende benutzen. D.h. du mußt '\r' und '\n' für einen Zeilenumbruch in die Datei schreiben.

Gruß
 
Hi.

Da du ja die Low-Level Funktionen benutzt mußt du statt eines einfachen LF (LineFeed) das unter Windows übliche CRLF für ein Zeilenende benutzen. D.h. du mußt '\r' und '\n' für einen Zeilenumbruch in die Datei schreiben.

Gruß
Das ich auf die Idee nicht selber gekommen bin. *kopfschüttel*
Aber funktioniert!

Schritt für Schritt wird die Software langsam fertig :)

was jetzt noch fehlt ist das schreiben ab der richtigen Position und für's erste bin ich happy. ^^
 
Hier nochmals zusammengefasst meine Fragen mit der Lösung:

marcosan hat gesagt.:
1. Text „anfügen“
Der vom Scanner eingelesene Text wird zwar in der Datei gespeichert, er überschreibt aber den alten Inhalt. Eigentlich sollte der Text auf einer neuen Zeile im Textfile angefügt werden.
Mit hilfe der Funktion SetFilePointer() kann man den Pinter in einer Datei beliebig hin und her schieben und so z.B. an das ende einer Datei gehen.


marcosan hat gesagt.:
2. dynamische Länge der Daten die eingelesen werden.
WriteFile (hFile,g_pszTextLabel,20,&Readd, NULL); die 20 sollte durch den dynamischen Wert in nTextLength ersetzt warden. Setze ich nTextLength anstelle der 20 ein, so wird nur 50% der Daten in g_pszTextLabel gespeichert.
Weniger ein Programmierproblem. normalerweise löst man es mit sizeof(stringname), in diesem Fall aber musste ich berücksichtigen das der String nicht aus "normalesn" CHARs zusammengesetzt war.


marcosan hat gesagt.:
3. Zeinenumbrüche
Ich würde gerne in einem String einen Zeilenumbruch in die Textdatei speichern. Aber weder \n noch andere Formatierungen die mir bekannt sind, scheinen zu gehen.
Da hat mir Microsoft einen Strich durch die Rechnung gezogen.
Anstatt \n muss man \r\n verwenden um einen Zeilenumbruch zu bekommen.

Danke an alle Antworter für die Tipps und Ideen.
 
Zurück