#include #include #include #include FILE * sequopen(FILE *fp, char fn[], char rwa[]); // da habe ich lange gebraucht, bis ich auf FILE * gekommen bin int sequread(FILE *fp, char satz[]); int sequwrite(FILE *fp, char satz[], int lng_s); int sequclose(FILE *fp, char rwa[]); int main(int argc, char *argv[]) { // ich weiss dass man strukturen auch direkt an funktionen übergeben kann // aber das ist mir zu kompliziert union { char satz[100]; struct { char sa[4]; char name[30]; char adresse[50]; } stamm; struct { char sa[4]; int saldo; int umsatz; } bewegung; } un; if (argc!=3) { printf("Bitte Aufruf ./Programm file mode\n"); // mode r,w,a lesen, schreiben, hinzufügen return 0; }; FILE *fp; fp=sequopen(fp,argv[1],argv[2]); strcpy(un.stamm.sa,"A100"); strcpy(un.stamm.name,"Franz Teuxelsieder"); strcpy(un.stamm.adresse,"Wuzelwang am Wuzel"); if (argv[2][0]!='r'){ sequwrite(fp,un.satz,sizeof(un.stamm)); }; strcpy(un.bewegung.sa,"B100"); un.bewegung.saldo=2; un.bewegung.umsatz=20000; if (argv[2][0]!='r'){ sequwrite(fp,un.satz,sizeof(un.bewegung)); }; if (argv[2][0]=='r') { int lng=sequread(fp,un.satz); char sa[4]; while(lng != -1){ strncpy(sa,un.satz,sizeof(sa)); printf ("satzart laenge %s %d\n",sa,lng); lng=sequread(fp,un.satz); }; }; sequclose(fp,argv[2]); return 0; } FILE * sequopen(FILE *fp, char fn[], char rwa[]) { union { int l_satz; char la[4]; } lng; union { char satz[38]; struct { char sa[4]; char datum[8]; char zeit[6]; char kurz_bez[20]; } vorsatz; } un; char datum[9],zeit[7]; // printf ("vor open\n"); fp=fopen(fn,rwa); if (rwa[0]=='w') { memcpy(un.vorsatz.sa,"VORS",sizeof(un.vorsatz.sa)); time_t t = time(NULL); struct tm tm = *localtime(&t); sprintf(datum,"%d%02d%02d",tm.tm_year+1900,tm.tm_mon+1,tm.tm_mday); sprintf(zeit,"%02d%02d%02d",tm.tm_hour,tm.tm_min,tm.tm_sec); memcpy(un.vorsatz.datum,datum,8); memcpy(un.vorsatz.zeit,zeit,6); memcpy(un.vorsatz.kurz_bez,"Dateiformat Groeger",20); fwrite(un.satz,1,sizeof(un.vorsatz),fp); }; if (rwa[0]=='a') { if (fseek(fp,0,SEEK_SET)!=0) { printf("fseek an den Anfang gescheitert\n"); }; fclose(fp); fp=fopen(fn,"r+"); // r+ habe ich nach zahlreichen Tests gefunden, scheinbar funktioniert // nur damit das fseek -4 das es erlaubt die eof Marke zu überschreiben fread(un.satz,1,sizeof(un.vorsatz),fp); // Vorsatz überprüfen if (memcmp(un.vorsatz.sa,"VORS",sizeof(un.vorsatz.sa))!=0) { printf("Abort Vorsatz nicht korrekt %s\n",un.vorsatz.sa); abort(); }; if (fseek(fp,-sizeof(int),SEEK_END)!=0){ printf("fseek gescheitert\n"); }; }; if (rwa[0]=='r') { fread(un.satz,1,sizeof(un.vorsatz),fp); if (memcmp(un.vorsatz.sa,"VORS",sizeof(un.vorsatz.sa))!=0){ printf("Abort Vorsatz nicht korrekt %s\n",un.vorsatz.sa); abort(); }; }; return fp; } int sequread(FILE *fp, char satz[]) { union { int l_satz; char la[4];} lng; // länge bzw end of file marke lesen fread(lng.la,1,sizeof(int),fp); if (lng.l_satz!=-1){ fread(satz,1,lng.l_satz,fp); }; return lng.l_satz; } int sequwrite(FILE *fp, char satz[], int lng_s) { union { int l_satz; char la[4];} lng; lng.l_satz = lng_s; fwrite(lng.la,1,sizeof(int),fp); fwrite(satz,1,lng_s,fp); return 0; } int sequclose(FILE *fp, char rwa[]) { union { int l_satz; char la[4];} lng; if (rwa[0]!='r') { // end of file marke: länge = -1 lng.l_satz = -1; fwrite(lng.la,1,sizeof(int),fp); }; fclose(fp); return 0; }