www.mikrocontroller.net

Forum: PC-Programmierung C in Datei schreiben


Autor: Marvin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fprintf(fd,%x",transfer);
sollte wohl
fprintf(fd,"%x",transfer);
sein.

Autor: Marvin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)}

Autor: Marvin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.