Forum: PC-Programmierung C in Datei schreiben


von Marvin (Gast)


Lesenswert?

ich habe ein C- Problem und ich hoffe ihr lacht mich nicht aus:

Ich will ein Array (transfer[25]) in eine Datei schreiben.
In dem Arrays ind lauter Hex Werte.

Nun mach ich es wie ich es im Internet gefunden habe:

fd = fopen ("/var/werte.txt","w");
if (fd != NULL)
{ fprintf(fd,%x",transfer);
fclose(fd)}

wenn ich das jetzt kompiliere bekomme ich folgende Fehlermeldeung:
"unterminated string or charakter constant"
"possible real start of unterminated constant"

Hat jemand eine Idee wie ich das Problem lösen kann?
Gruß

von Benedikt (Gast)


Lesenswert?

fprintf(fd,%x",transfer);
sollte wohl
fprintf(fd,"%x",transfer);
sein.

von Marvin (Gast)


Lesenswert?

Danke habe es einfach nicht gesehen

jetzt meckert der Compilernoch wegenPointern und Intiger geschichten
rum

"makes Pointer from Integer without a cast" bei fprintfund fclose.

Na ja mal sehen das Problem wird jetzt angegangen

Nochmal danke

von Karl H. (kbuchegg)


Lesenswert?

> fprintf(fd,"%x",transfer);

Wenn transfer ein Array ist, dann wird das so nichts.
Beantworte doch einfach mal die Frage: Woher weiss denn
bitte fprintf() wie gross das Array ist?

Siehst du, das kann so nicht gehen.

Denk immer daran: Arrays sind in C nur 'halbe' Datentypen.
Mit Arrays kann man viele Dinge nicht machen, die mit
normalen, skalaren, Datentypen möglich sind, wie zb. Zuweisung.

if (fd != NULL)
{
  for( i = 0; i < sizeof(transfer)/sizeof(*transfer); ++i )
    fprintf( fd, "%x", transfer[i] );

  fclose( fd );
}

(Die sizeof Geschichte geht natuerlich nur dann, wenn die
Array-Deklaration für den Compiler an dieser Stelle auch
wirklich sichtbar ist. Ansonsten setzt du einfach die Anzahl
der Elemente des Arrays ein. Falls obiges in einer Funktion
ist, dann wird halt, zb neben dem Array auch noch dessen Größe
mit an die Funktion übergeben.

fclose(fd)}

von Marvin (Gast)


Lesenswert?

es ist mir schon etwas peinlich aber ...
DAnke an alle das in eine Datei schreiben klappt nur das auslesen
nicht...

dachte mir das mach ich genau so nur nicht fprintf sondern fscanf.
In der DAtei stehen die Hex-Werte 0x26 0x23 0x03 0xda 0xd0
folgendermassen drin: 262303dad0
also Datei öffnen:
   fp  = fopen ("/var/Werte.txt","r");
Versuch 1 auslesen :
   for (d=0;d<5; d++)
   fscanf(fp , "%x",transfer[d]);
Versuch 2:
fscanf(fp , "%02x %02x %02x ",transfer[0],transfer[1],transfer[2]);

beides hat mir nicht die WErte in der Werte.txt geliefert.
Weiß jetzt nicht mehr weiter da im Netz es prinzipiell auch so gemacht
wird und mir meine C-Bücher es auch so machen. Die Datei gibt es( auch
in dem Verzeichniss mit dem Inhalt und ein anderes Programm greift
nicht dadrauf zu da ich sie extra zum Testen des einlesens erstellt
habe)

Also wenn ihr einen Tip für mich habt ...
ich weiß so langsam nicht mehr weiter

Gruß
Marvin

von Karl H. (kbuchegg)


Lesenswert?

klassischer Fehler.
fscanf braucht einen Pointer auf den Speicher wo es seine
Ergebnisse ablegen soll:

  fscanf(fp , "%x",&transfer[d]);

                   ^
                   |
                der hier

das ist im Grunde dasselbe, wei enn du schreibst

void foo( int i )
{
  i = 5;
}

void test()
{
  int j;
  foo( j );
}

und dich wunderst warum j niemals den Wert 5 kriegt.

Die Lösung dafür lautet:

void foo( int* i )
{
  *i = 5;
}

nur musst du halt beim Aufruf dann auch eine Adresse angeben.

   foo( &j );

In diesem Fall kann der Compiler das alles prüfen und dafür
sorgen, dass du wirklich einen Pointer an foo übergibst.
Nur: printf, scanf und Konsorten sind variadische Funktionen.
Der Compiler hat daher keine Möglichkeit zu prüfen, ob die
Argumenttypen richtig sind und muss sich drauf verlassen dass
du das schon richtig machst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Anzumerken sei noch, daß der Formatspezifizierer %x scanf einen Pointer
auf int erwarten lässt.

Stattdessen Pointer auf char / unsigned char zu übergeben ist ...
problematisch.

Einen standardisierten Weg für das einlesen eines char / unsigned char
aus einer formatierten Hexadezimalzahl via scanf scheint es nicht zu
geben.

Auch aus diesem Grund ist vom Gebrauch von scanf ebenso wie dem seiner
Verwandten sscanf und fscanf abzuraten.

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.