Forum: PC-Programmierung Datei aus C Programm beschreiben


von Mr Bean (Gast)


Lesenswert?

Hallo

Ich möchte aus einem C Programm Daten in eine Datei schreiben. Das 
Schreiben auf die Datei funktioniert schon. Allerdings möchte ich die 
Strings die geschrieben werden, mit Leerzeichen und TAB`s noch 
formatieren. Das funktioniert leider überhaupt nicht. Sobald ich ein 
Leerzeichen in den String einfüge, wird dieser beim nächsten Zugriff auf 
die Datei ab diesem Leerzeichen wieder überschrieb (ein Problem mit der 
0 Terminierung!?). Andere Zeichen wie der horizontale Tabulator werden 
gar nicht eingefügt... Habt ihr mir hier einen Tipp wie ich das in 
meinen Code rein bekomme?
1
void export_clicked(GtkWidget *widget, gpointer data)
2
{
3
  FILE * fd;
4
  int length = 0;
5
  char buf[80];
6
  char buffer[5000];
7
  struct stat attribut;
8
9
  length = sprintf(buf, "Temperatur:%s+%d°C\n\r", 0x32, temperature);
10
11
//starting the file operation
12
13
  stat(FILENAME, &attribut);  
14
  fd = fopen(FILENAME , "r+");
15
  if (fd == NULL)
16
  {
17
    //unable to open file.
18
    printf("open_file: Unable to open %s", FILENAME);
19
  }
20
  printf("buf: %s", buf);  
21
  fscanf(fd, "%s", buffer);
22
  printf("string: %s\n", buffer);
23
  fprintf(fd,"%s", buf);
24
  fclose(fd);
25
26
}

von Peter II (Gast)


Lesenswert?

Mr Bean schrieb:
> sprintf(buf, "Temperatur:%s+%d°C\n\r", 0x32, temperature);

soll das der Versuch von dem Leerzeichen sein? %s erwartet einen String 
0x32 ist aber ein char.
1
sprintf(buf, "Temperatur: +%d°C\n\r", temperature);
2
3
oder
4
5
sprintf(buf, "Temperatur:\t+%d°C\n\r", temperature);

von Mr Bean (Gast)


Lesenswert?

Hallo

Ja sorry da ist das %s drin geblieben. Sollte eigentlich ein %c sein. 
Habe hier schon einiges ausprobiert...
Wollte so eigentlich die Formatierungszeichen (Leerzeichen und 
Tabulator) in den String einfügen.

Gruß

Bean

von smarty9797 (Gast)


Lesenswert?

Mr Bean schrieb:
> Wollte so eigentlich die Formatierungszeichen (Leerzeichen und
> Tabulator) in den String einfügen.

Außerdem solltest Du statt "0x32" entweder "0x20" oder "32" schreiben, 
sonst bekommst Du statt eines Leerzeichens die "2" ausgegeben.

Gruß,
smarty9797

von Mr Bean (Gast)


Lesenswert?

Hallo smarty

Danke, das ist mir auch gerade aufgefallen. Aber ändern tut das 
irgendwie nichts.
Die Funktion wird bei jedem Tastendruck (ist ein gtk Programm) 
aufgerufen. Ich habe irgendwie das Gefühl dass das Schreiben auf die 
Datei nicht am Ende ausgeführt wird, sondern ab dem ersten Leerzeichen 
innerhalb der Datei. Wie kann ich das umgehen?

Gruß

Bean

von Peter II (Gast)


Lesenswert?

Mr Bean schrieb:
> Die Funktion wird bei jedem Tastendruck (ist ein gtk Programm)
> aufgerufen. Ich habe irgendwie das Gefühl dass das Schreiben auf die
> Datei nicht am Ende ausgeführt wird, sondern ab dem ersten Leerzeichen
> innerhalb der Datei. Wie kann ich das umgehen?

du öffnest du datei auch mit

r+

damit steht meines wissens der Zeiger an anfang, du willst aber daten 
anhängen. Dafür verwendet man: a+.

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

und eine Datei ständig zu öffenn un zu schließen ist keine so gute Idee.

von Mr Bean (Gast)


Lesenswert?

Hallo Peter

Vielen Dank für den Tipp! Da lag das Problem. Da bin ich irgendwie nicht 
drauf gekommen dass es auch am Öffnen der Datei liegen kann. Dachte 
immer mit dem Zusammensetzen des Strings wäre was Falsch.
Im normalen Betrieb der Applikation wird es nicht oft vorkommen dass die 
Datei geöffnet/beschrieben wird. Ich schätze die Datei wird vielleicht 
alle 10 Minuten beschrieben.
Trotzdem würde es mich freuen wenn Du mit ein exemplarisches Beispiel 
hast wie man das sonst macht.

Gruß

Bean

von Peter II (Gast)


Lesenswert?

Mr Bean schrieb:
> Datei geöffnet/beschrieben wird. Ich schätze die Datei wird vielleicht
> alle 10 Minuten beschrieben.
dann ist es ok.

> Trotzdem würde es mich freuen wenn Du mit ein exemplarisches Beispiel
> hast wie man das sonst macht.
einfach einmal öffnen und die Datei offen lassen, du musst dafür das 
filehandel global in der klasse anlegen. Dann darf man nur nicht 
vergessen bei beendet die Datei zu schließen.

von Mr Bean (Gast)


Lesenswert?

Ah ok. Das mit dem global Anlegen der Datei wäre natürlich eine 
Möglichkeit. Dann könnte ich die Datei beim Verlassen der Applikation 
auch an einer anderen Stelle schließen.
Aber naja, im Moment funktioniert es erst mal so.

Danke nochmal

Gruß

Bean

PS.: Ich glaube dieser Thread ist ein Beispiel dafür dass es in diesem 
Forum auch noch Threads gibt in denen einem wirklich weiter geholfen 
wird...

von DirkB (Gast)


Lesenswert?

smarty9797 schrieb:
> Außerdem solltest Du statt "0x32" entweder "0x20" oder "32" schreiben,
> sonst bekommst Du statt eines Leerzeichens die "2" ausgegeben.

Besser noch er schreibt gleich das, was er auch will: ' ' oder '\t'.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.