Forum: PC-Programmierung struct in file


von Alibaba (Gast)


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

von Karl H. (kbuchegg)


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.

von Alibaba (Gast)


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.

von Alibaba (Gast)


Lesenswert?

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

von Alibaba (Gast)


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.

von Alibaba (Gast)


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');}

von Karl H. (kbuchegg)


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-bbrown/c_075.htm

von Alibaba (Gast)


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

von Karl H. (kbuchegg)


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?
1
#include <stdio.h>
2
3
int main()
4
{
5
  char fileName[] = "test.dat";
6
  FILE * fOutput = NULL;
7
  unsigned char data[] = { 0x20, 0x21, 0x30, 0x31 };
8
  
9
  fOutput = fopen( fileName, "ab" );
10
  if( fOutput ) {
11
    fwrite( data, sizeof( data ), 1, fOutput );
12
    fclose( fOutput );
13
  }
14
  else
15
    printf( "Failed to open File: %s", fileName );
16
}

von Alibaba (Gast)


Lesenswert?

hab dein text in mein code eingebunden alles funzt wunderbar.

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.