tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
31
ZUGRIFFE
1708
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Hi zusammen,

    ich habe hier ein Bsp-Programm das zeigt das erstellen einer .dat datei und dann mit fwrite das irgendwie binär in die datei ".dat" schreibt.


    1. Was bedeutet der format ".dat"?

    2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?

    3. Wenn ich die .dat nach dem compilieren mit Hilfe des Notpad++ öffne, dann steht da:
    )NUL NUL NUL#HNUL NUL usw. Was bedeutet das? Das ist doch kein Binär.

    4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?


    Hier das Programm:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    
    //1. c-file(main)
    #include <stdio.h>
    #include <stdlib.h>
    #include "compl.h"
     
    #define MAX_STRLEN 20
     
    void main()
    {
      char filename[MAX_STRLEN]="daten.dat";
      int file_len = 20;
      FILE *outFile=NULL;
      complex* arrayValues=NULL;
      complex* actVal = NULL;
      int n=0;
     
      arrayValues=malloc(sizeof(complex)*file_len);
      if (arrayValues != NULL)
      {
        actVal=arrayValues;
        for(n=0; n<file_len; n++)
        {
          actVal->real=rand();
          actVal->imag=rand();
              c_print(*actVal);
          actVal++;
        }
        actVal=arrayValues;
        outFile=fopen(filename,"wb");   // wb = write binary siehe buch
     
        if (outFile != NULL) 
        {
                if (file_len != fwrite(arrayValues,sizeof(complex),file_len,outFile))
                {
                    printf("error during write of %d blocks!\n",file_len);
                }
          fclose(outFile);
        }
            else
            {
                printf("cannot write file %s!",filename);
     
            }
        free(arrayValues);
      }
    }
     
    //2. c-file:
    #include "compl.h"
    #include <stdio.h>
     
    void c_print(complex a)
    {
      printf("%d + j%d\n",a.real,a.imag);
    }
     
    //h-file:
    struct complex_struct
    {
      int real;
      int imag;
    };
    typedef struct complex_struct complex;
     
    void c_print(complex a);

    Gruß

    Googlehupf
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Googlehupf Beitrag anzeigen
    1. Was bedeutet der format ".dat"?
    Nichts. Es ist eine beliebige Endung. "DATA"
    Zitat Zitat von Googlehupf Beitrag anzeigen
    2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?
    Was ist denn dein Fall?
    Zitat Zitat von Googlehupf Beitrag anzeigen
    3. Wenn ich die .dat nach dem compilieren mit Hilfe des Notpad++ öffne, dann steht da:
    )NUL NUL NUL#HNUL NUL usw. Was bedeutet das? Das ist doch kein Binär.
    Alles auf dem Computer ist binär.

    Der Editor zeigt aber natürlich Zeichen an und keine Bits.
    Zitat Zitat von Googlehupf Beitrag anzeigen
    4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?[/B]
    fwrite wandelt gar nichts um. Die Daten werden so wie sie im Speicher stehen in die Datei geschrieben, Byte für Byte.

    Gruß
    Googlehupf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von Googlehupf Beitrag anzeigen
    1. Was bedeutet der format ".dat"?
    Nix weiter. Dateiendungen sind nur Kosmetik und ich nehme an, man wollte damit ausdrücken, dass es sich um rohe DATen handelt. ".dat"


    Zitat Zitat von Googlehupf Beitrag anzeigen
    2. Was bringt es überhaupt Werte binär in ein file schreiben in meinem Fall?
    Du kannst Sie mit fread einfach wieder einlesen. Du schreibst die Daten roh raus und ließt sie roh ein. Man muss sich keine Gedanken über irgendwelche Standards (xml etc.) machen.


    Zitat Zitat von Googlehupf Beitrag anzeigen
    3. Wenn ich die .dat nach dem compilieren mit Hilfe des Notpad++ öffne, dann steht da:
    )NUL NUL NUL#HNUL NUL usw. Was bedeutet das? Das ist doch kein Binär.
    Wieso ist das kein Binär? Notepad++ zeigt dir freundlicherweise auch \0 Bytes an, anstatt sie unsichtbar zu lassen. Denn im Zeichensatz gibt es dafür kein Zeichen. Es gibt außerdem kein nicht-Binär.


    Zitat Zitat von Googlehupf Beitrag anzeigen
    4. fwrite() wandelt alle Zahlen auf den der Pointer actVal bzw. arrayValues zeigt in Binär um, oder wie funktioniert das genau?[/B]
    Für jedes Byte wird ein Byte in die Datei geschrieben. Wenn du z.B. einen double Wert mit 64 Bit hast werden 8 Byte in die datei geschrieben, genau in der Reihenfolge, wie Sie im Speichern liegen. Mehr dazu hier http://en.wikipedia.org/wiki/IEEE_75...#Basic_formats und für das Beispiel hier http://en.wikipedia.org/wiki/Double_...rmat:_binary64 (siehe Bild)
    Googlehupf bedankt sich. 

  4. #4
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Zitat Zitat von deepthroat Beitrag anzeigen
    Was ist denn dein Fall?
    Ich soll ein Übungsprogramm schreiben das so in etwa aussehen soll:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    Kurzbeschreibung : Programm zum Ueben von dynamischer Speicherverwaltung,[B]binaeren FileIO.[/B] 
    Implementierung zum Test von malloc free  
    Ueben von modularem Programmieren und ueben von Strukturen mit Pointern.
     
    Entwerfen Sie ein Modul zur Verwaltung von Terminen.
    Ein Termin muss folgendes enthalten:
    Thema
    von (Datum + Uhrzeit als Typ) 
    bis (Datum + Uhrzeit als Typ)
    Teilnehmer
    Prioritaet  (HOCH, MITTEL, NIEDRIG)
    Beschreibung
    Status (ERLEDIGT, OFFEN)
     
    Schreiben sie ein kleines Menue zum Verwalten der Termine.
    Folgende Punkte muessen enthalten sein: Eingabe, Ausgabe eines 
    Termines oder der gesamten Liste. Loeschen und Anfuegen von Terminen.
    Die Termine sollen in einem Binaerfile gespeichert werden.
    Termine sollen geloescht werden koennen und 
    als erledigt markiert werden koennen.

    Ja in diesem Fall muss ich binäres File io üben, aber was hat das mit Termindaten zu tun? Ich soll also ein Menü schreiben zum Verwalten der Termine etc.

    Die Termine sollen in ein Binärfile gespeichert werden. Ja und mit "wb" schreibe ich binär in ein file korrekt?

    Ich weis halt nicht wie ich da anfangen könnte, ich schätze mal vieles mit scanf zum Eingeben der Termine, Priorität etc.

    Aber wie gesagt ich weiß gar nicht wie ich da Anfangen soll .

    Kann mir da wer weiterhelfen bitte?
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Ja in diesem Fall muss ich binäres File io üben, aber was hat das mit Termindaten zu tun?
    Es ist ein Übungsprogramm. Irgendwie muss man die Daten ja speichern. Es soll kein Textformat sein, sondern ein binäres Format.
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Die Termine sollen in ein Binärfile gespeichert werden. Ja und mit "wb" schreibe ich binär in ein file korrekt?
    Nicht ganz. Die Datei wird im Binärmodus (im Gegensatz zum Textmodus) geöffnet. D.h. einfach nur, dass keine Übersetzung von \n in \r\n und zurück unter Windows gemacht wird. Ansonsten gibt's keinen Unterschied.

    Das eigentlich "binäre" Schreiben geschieht mit fwrite (im Gegensatz zu fprintf, welches Text schreibt).
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Ich weis halt nicht wie ich da anfangen könnte, ich schätze mal vieles mit scanf zum Eingeben der Termine, Priorität etc.
    Ja, Benutzerinterface, Daten abfragen usw.

    Dann Datenhaltung, speichern von Terminen usw.
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Aber wie gesagt ich weiß gar nicht wie ich da Anfangen soll .
    Eine Struktur für einen Termin wäre ein guter Anfang.

    Dann versuch diese Struktur (bzw. mehrere davon) in eine Datei zu schreiben.

    Dann wieder auslesen.

    Damit bist du schonmal für's Wochenende beschäftigt...

    Gruß
    Googlehupf bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Ok, danke.

    Aber klingt doch irgendwie einfach... alles mit Hilfe von scanf in eine Struktur reinlesen und die struktur dann in ein .dat file mit fwrite reinschreiben oder?

    Sicher das das nicht komplezierter ist oder täuscht das?

    Bzw. was ist mit Unterprogramme/Funktionen - Wo soll man den die hier nutzen.

    Bis jetzt habe ich immer ein Unterprogramm/Funktion gebraucht, wenn ich was berechne oder so.

    Aber hier habe ich keine blassen schimmer? Die ganze einlesungen in die Struktur vielleicht?

    Und was ist mit Modulen - Wie viele C- und h-files?

    Bis jetzt hab ich es immer so gemacht: 1 c-file für Hauptprogramm, 1 c-file fürs auslesen eines files(unterprogramm) und 1 c-file für die rechnungen(unterprogramm) und 2 h-files die jeweils zu den 2 c-files mit Unterprogrammen gehören.

    Kann mir wer bitte mehr Tipps geben ?
     

  7. #7
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Zitat Zitat von Googlehupf Beitrag anzeigen
    Sicher das das nicht komplezierter ist oder täuscht das?
    Ja, sicher..

    Statt die ganzen einzelnen Teile der Struktur einzeln mit fprintf/fscanf
    in die Datei zu schreiben/daraus zu lesen braucht man für die ganze struct
    nur ein fwrite/fread.

    Ein "Nachteil" ist dann eben, dass die Datei nicht wirklich lesbar ist.
    Falls das sein muss gehts mit den Funktionen nicht, ist ja aber nicht gefragt.

    Gibt noch einige potenzielle Probleme, die hier aber nicht auftreten werden.
    Betrifft vor allem Compiler-/Plattformwechsel.


    Und zur Funktions-/Dateiaufteilung:
    Wenn das ganze Programm nicht mehr macht als einlesen/speichern/laden
    würd ich mir das gar nicht überlegen, sondern einfach alles ins main...

    Wenn man unbedingt will, eben das Einlesen von der Tastatur.
    struct im main per Pointer übergeben und in der Funktion befüllen.

    Andere Aufteilungen verkomplizieren das nur unnötig.

    Gruß
    Googlehupf bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  8. #8
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Danke dir!

    Welcher Sinn steckt den dahinter bei dieser Übung? Was soll/kann ich mit dem Binär fall oder im demfall mit dem verschiedenen Zeichen(1 Zeichen = 1 Byte) die in der .dat datei stehn machen?
     

  9. #9
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wieder auslesen?
    Tieferen Sinn gibts bei einer Übung wohl nicht...
    Googlehupf bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  10. #10
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Ich habe das mit strukturen gemacht. Sry wenn er das auch gemacht hat habe es nur überflogen Also ich speicher so immer meine "SaveGames" vom Spiel. Also Position, Blickrichtung, Objekte, Lebensenergie, usw. Das ist einfacherer als alles in einzelnen Werten reinzuschreiben
     
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  11. #11
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Danke!

    Ahja, und in diesem Ordner wo die Angabe(uebung.c) ist, ist noch eine Datei drinnen...
    "._uebung.c"(<--- ist sozusagen transparent) heißt die und wenn ich diese öffne, dann erscheinen komische Zeichen(✠  œ ). Da steht irgendwas mit apple drinnen macOx textcoding apple.com etc. .
    Der Lehrer hat auch einen Mac-Laptop. Ist die Datei wichtig für die Übung?
     

  12. #12
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hellsehen können wir nicht, aber ich sag mal nein.
    Googlehupf bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  13. #13
    Avatar von MSVCplusplus
    MSVCplusplus MSVCplusplus ist offline Mitglied Brokat
    Registriert seit
    Dec 2010
    Ort
    Hessen
    Beiträge
    336
    Also mit Transparent meinst du vll Unsichtbar? Also guck mal ob die Datei noch da ist wenn du deine IDE wieder schliesßt. Vll ist es nur eine Auslagerungsdatei.
    Googlehupf bedankt sich. 
    Fehlermeldung bitte!
    Google - Dein Freund und Helfer

  14. #14
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Ist noch immer da, aber glaub ist egal... Habs einfach vom Projekt ausgeschlossen.

    Auf jedenfall hab ich jetzt angefangen diese Übung zu programmieren und es treten Fehler auf, die ich nicht finden kann:

    Also, mein Problem:
    Wenn ich das ganze mit scanf mache dann geschieht folgendes beim "Starten ohne Debugging": Ich kann och die anzahl der Termine eingeben und auch noch das Thema aber dann kommt: "'name des programms'.exe funktioniert nicht mehr".

    Wenn ich das ganze mit gets mache dann geschieht folgendes beim "Starten ohne Debugging": Hier kann ich auch noch die Anzahl eingeben aber dann kommt:siehe Bild

    Jetzt mal abgesehn von den Fehlern passt es den in etwa so wie ich es programmiert habe?

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    
    1. c-file(main):
    #include "write_termin.h"
    #include "w_binaer_file.h"
    #include <stdio.h>
     
    void main()
    {
      char filename[MAX_LEN]="daten.dat";
        terminData* daten=NULL;
        int anz=0;
     
        printf("Geben Sie bitte die Anzahl Ihrer Termine ein:");
        scanf("%d",&anz);
     
        daten=write_termin(filename,anz);
        write_binaer_file(filename,daten,anz);
     
        free(daten);
    }
     
     
    2. c-file:
    #include "write_termin.h"
    #include <stdio.h>
     
    terminData* write_termin(char filename[], int anz)
    {
      terminData* daten=NULL;
        terminData* daten1=NULL;
     
        int n=0;
     
        daten=(terminData*)malloc(sizeof(terminData)* anz);
        if(daten != NULL)
        {
            daten=daten1;
            while(n<anz)
            {
                printf("Thema des Termins:\n");
                scanf("%s",&daten1->topic);
                //gets(daten1->topic);
     
                printf("Anfangsdatum des Termins:\n");
                scanf("%s",&daten1->start_date);
                //gets(daten1->start_date);
     
                printf("Enddatum des Termins:\n");
                scanf("%s",&daten1->end_date);
                //gets(daten1->end_date);
                
                printf("Wer nimmt teil?\n");
                scanf("%s",&daten1->user);
                //gets(daten1->user);
                
                printf("Priorität des Termins(HOCH, MITTEL, NIEDRIG:\n");
                scanf("%s",&daten1->priorität);
                //gets(daten1->priorität);
            
                printf("Beschreibung des Termins:\n");
                scanf("%s",&daten1->description);
                //gets(daten1->description);
            
                printf("Status des Termins(ERLEDIGT, OFFEN):\n");
                scanf("%s",&daten1->start_date);
                //gets(daten1->start_date);
                n++;
                daten1++;
            }
        }
        else
        {
          printf("Memory allocation Failure!");
        }
     
        return(daten);
    }
     
     
    3. c-file:
    #include "write_termin.h"
    #include "w_binaer_file.h"
    #include <stdio.h>
     
    void write_binaer_file(char filename[],terminData* termindaten, int anz)
    {
      FILE* outFile=NULL;
     
        outFile=fopen(filename,"wb");
      if(outFile != NULL)
        {
          if(anz != fwrite(termindaten,sizeof(terminData),anz,outFile))
            {
              printf("error during write of %d blocks",anz);
            }
        }
        else
        {
          printf("File %s could not be opened",filename);
        }
     
        fclose(outFile);
    }
     
     
    1. h-file:
     
    #ifndef _write_termin_h_
    #define _write_termin_h_ 1
     
    #define MAX_LEN 100
     
    struct struct_termin
    {
      char topic[MAX_LEN];
        char start_date[MAX_LEN];
        char end_date[MAX_LEN];
      char user[MAX_LEN];
        char priorität[MAX_LEN];
        char description[MAX_LEN];
        char state[MAX_LEN];
    };
     
    typedef struct struct_termin terminData;
     
    terminData* write_termin(char filename[], int anz);
     
    #endif
     
    2. h-file:
     
    #include "write_termin.h"
    #ifndef _wbinaer_file_h_
    #define _wbinaer_file_h_ 1
     
    void write_binaer_file(char filename[],terminData* termindaten, int anz);
     
    #endif
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Binär einlesen/auslesen(fread, fwrite)-error.png  
     

  15. #15
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    da ist nichts "ohne Debugging"
    Du bist nach wie vor im Debugmodus.

    Hab mir nicht alles angeschaut, hast aber komische Pointersachen da drin.

    write_termin:
    Du allokierst etwas für daten, in daten1 ist derweil NULL.
    Dann überschreibst du daten mit daten1.
    Ergebnis: Beide sind NULL.
    Dann verwendest du daten...

    Vllt. solltest du sinnvollere Variablennamen geben?

    Und im main freigeben, was wo anders angelegt wurde, ist unschön.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

Ähnliche Themen

  1. Auslesen von Datei ... fread
    Von crsakawolf im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 27.04.09, 16:18
  2. Datei binär einlesen
    Von Bastih84 im Forum C/C++
    Antworten: 16
    Letzter Beitrag: 27.04.05, 21:24
  3. einlesen und ausgeben in binär
    Von F_P_aus_K im Forum .NET Archiv
    Antworten: 0
    Letzter Beitrag: 08.11.04, 13:32
  4. [C] Probleme mit fwrite & fread
    Von Yupa im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 14.03.04, 12:01
  5. Wie funktioniert fread/fwrite
    Von Bennily im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 13.03.04, 19:04