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ß
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
> 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)}
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.