mikrocontroller.net

Forum: PC-Programmierung struct in file


Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich sehe den Fehler einfach nicht!
Ich versuche den Status einer Karte die am PCI-Bus hängt auszulesen.

Dazu gibt es eine Funktion die sich "StatusGet" nennt, ein Example ist 
auch eingefügt:

 * STATUS  Stat;
 *
 * StatusGet(hDevice, &Stat);
 * if (Stat.adc_irq)
 *   printf("ADC Interrupt is active\n");

 Allerdingts wird an dieser Stelle nur ein Bit aus der Strukur STATUS 
ausgelesen.

Ich will allerdings das Komplette Reg. auslesen und in ein File 
speichern,
bis jetzt habe ich so versucht es klappt allerdings nicht, in das 
erzeugte File wird nichts geschrieben.

************************************************************************ 
**

STATUS           Stat;
FILE            *fdStatus;
char            fnameTest1[80];
.
.

main(){
.
.

 sprintf(fnameTest1, "Status");

 if(NULL == (fdStatus = fopen (fnameTest1, "a")))
   printf ("\nCannot open file %s\n", fdStatus);

  else
   for (i=0; i<cycle; i++) {
   .
   .
   .
   StatusGet(hDevice, &Stat);
   write(fdStatus,&Stat,sizeof(STATUS));
 }
 close(fdStatus);
}
************************************************************************ 
**

thanks for help

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

Bewertung
0 lesenswert
nicht lesenswert
Alibaba schrieb:

> bis jetzt habe ich so versucht es klappt allerdings nicht, in das
> erzeugte File wird nichts geschrieben.

Dann wird dein Programm nie zum write kommen.
wenn der write ausgeführt wird, wird auch etwas geschrieben. Im 
schlimmsten Fall irgendwas. Aber geschrieben wird etwas.

Wie hast du festhestellt, dass nichts im File ist?
Da es sich hier um Binärdaten handelt, kannst du kein Notepad benutzen, 
sondern brauchst einen HEX-Editor oder so was ähnliches.

Sicherheitshalber solltest du als Modus beim fopen auch "ab" angeben und 
nicht einfach nur "a" alleine. Du hast schliesslich Binärdaten und 
keinen Text.

NB: Hast du da einen Tippfehler?
Sollte das nicht fwrite sein anstelle von write.
Aber für fwrite passt die Parameterreihenfolge nicht.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere unter linux und benutze den hexdump um das file 
auszulesen, hat auch bis jetzt immer geklappt.

write?? ja es sollte auch write sein, hat bis jetzt auch immer gut 
geklappt.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube ich sehe den wald vor lauter bäumen nicht.
Aber trotzdem danke für die schnelle antwort

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den fehlerfall mal abgefragt:

if(-1 == write(fdStatus,&icsStat,sizeof(ICS554_STATUS)))
{putchar('a');}

es tritt immer ein fehler beim schreiben auf, hab aber keine Idee warum.

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alibaba schrieb:
> if(-1 == write(fdStatus,&icsStat,sizeof(ICS554_STATUS)))
> {putchar('a');}

so ist es natürlich richtig:
> if(-1 == write(fdStatus,&Stat,sizeof(STATUS)))
> {putchar('a');}

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

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dir nur raten:
Misch nicht die f.... Funktionen mit den raw Funktionen

fopen, fwrite, fread, fclose, fseek bilden eine Familie
open, write, read, close bilden eine Familie.

Wenn ich mich recht erinnere, benutzen die einen File Handles während 
die anderen Pointer auf FILE Strukuren übernehmen. Das passt alles nicht 
wirklich zusammen und eigentlich hätte dein Compiler da furchtbar heulen 
müssen.

http://gd.tuwien.ac.at/languages/c/programming-bbr...

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geändert und eine Familie benutzt:

int fh


if((fh = open("Status",O_CREAT, O_RDWR)) == -1) putchar('s');
if(-1 == write(fh,&Stat,sizeof(ICS554_STATUS))){putchar('a');}

trotzdem kein schreiben auf File möglich

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

Bewertung
0 lesenswert
nicht lesenswert
Alibaba schrieb:
> geändert und eine Familie benutzt:
>
> int fh
>
>
> if((fh = open("Status",O_CREAT, O_RDWR)) == -1) putchar('s');
> if(-1 == write(fh,&Stat,sizeof(ICS554_STATUS))){putchar('a');}
>
> trotzdem kein schreiben auf File möglich

Da du unter Linux bist: Berechtigungen zum Erzeugen des Files hast du?
#include <stdio.h>

int main()
{
  char fileName[] = "test.dat";
  FILE * fOutput = NULL;
  unsigned char data[] = { 0x20, 0x21, 0x30, 0x31 };
  
  fOutput = fopen( fileName, "ab" );
  if( fOutput ) {
    fwrite( data, sizeof( data ), 1, fOutput );
    fclose( fOutput );
  }
  else
    printf( "Failed to open File: %s", fileName );
}

Autor: Alibaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab dein text in mein code eingebunden alles funzt wunderbar.

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.