Advertisement
Blade83

Binary Filetransfer

Apr 30th, 2014
500
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.62 KB | None | 0 0
  1. #include <iostream> // std::cout, std::endl, std::cin
  2. #include <fstream> // std::fstream
  3. #include <string>  // std::cin >>
  4. #include <conio.h> // getch()
  5.  
  6. using std::fstream;
  7. using std::system;
  8. using std::cout;
  9.  
  10. struct datenStruktur
  11. {
  12.     char name[100];     // 100 Bytes
  13.     char Nachname[100]; // 100 Bytes
  14.     long nummer;        //   4 bytes
  15. };
  16.  
  17. datenStruktur StrukturGruppe[] = {
  18.     { "Meister", "Meier", 1 },
  19.     { "Proper", "Nachname", 2 },
  20.     { "MEISTERT", "Schroeder", 3 },
  21.     { "Martin", "Krause", 4 },
  22.     { "Marius", "Schmitz", 5 },
  23.     { "frischer", "Hofmann", 6 },
  24.     { "TonyStark", "Montana", 7 }
  25. }, rDatenStruktur;
  26.  
  27.  
  28. int main(void)
  29. {
  30.     // Binärdatei zum Schreiben und Lesen öffnen
  31.     fstream stream("StrukturGruppeArray.dat", std::ios::in | std::ios::out | std::ios::binary);
  32.     if (stream.is_open())
  33.     {
  34.         // Vorzeichenlose Int Variable mit dem Wert  ((204*7)/204) == 7! Errechnet die Anzahl
  35.         // an datenStruktur im Array StrukturGruppe[]
  36.         unsigned int uIStrukturArrayCount = (sizeof(StrukturGruppe) / sizeof(datenStruktur));
  37.         // StrukturGruppenArray per Binäroperator übergeben
  38.         // sowie die Gesamtgröße der StrukturGruppe in Bytes übergeben
  39.         stream.write(
  40.             (char*)&StrukturGruppe,
  41.             uIStrukturArrayCount * sizeof(datenStruktur)
  42.             );
  43.         // Die gesamte Datenstruktur sollte jetzt auf deiner Platte neben deiner *.exe Datei
  44.         // in "StrukturGruppeArray.dat" als Binärdatei gespeichert sein.
  45.         // Falls das nicht geklappt hat, erstelle die Datei manuell!
  46.  
  47.         // Auf Nutzereingabe warten, welche bestimmt welche von denn Verfügbaren Datenstrukturen
  48.         // gezielt aus der StrukturGruppeArray.dat geladen werden soll
  49.         unsigned int datenSatz;
  50.         do
  51.         {
  52.             cout << "Datensatz anzeigem: [1-" << uIStrukturArrayCount << "]: ";
  53.             std::cin >> datenSatz;
  54.         } while (datenSatz < 1 || datenSatz > uIStrukturArrayCount);
  55.         /*
  56.         *  Per fstream.write() haben wir eben das StrukturGruppe[] Array/Objekt binär nach StrukturGruppeArray.dat
  57.         *  kopiert. Die Gesamt Göße der StrukturGruppeArray.dat Datei müsste exakt 1428 Bytes betragen.
  58.         *  Mit fstream.read(...) kann der Inhalt der Datei wieder geladen werden. Bei einem einfachem Aufruf würde der
  59.         *  Dateizeiger am Anfang der Datei (Position 0 inerhalb der Datei) anfangen und sie bis zum Ende auslesen.
  60.         *  Mit der Methode fstream.seekg() können wir die Startposition ändern.
  61.         *  Angenommen du gibst 5 bei "Datensatz anzeigem" ein, sähe die Berechnung für denn Aufruf so aus:
  62.         *
  63.         *       stream.seekg((5-1) * 204);
  64.         *
  65.         *  Minus 1 wird gerecchnet, weil die niedrigste Eingabe bei "Datensatz anzeigem" als 1 angezeigt wurde. sie
  66.         *  aber in Wirklichkeit 0 ist. Die neue Rechnug sieht also so aus:
  67.         *
  68.         *       stream.seekg(816);
  69.         */
  70.         stream.seekg((datenSatz - 1) * sizeof(datenStruktur));
  71.         // Als nächstes wird fstream.read() ausgeführt.
  72.         stream.read(
  73.             (char*)&rDatenStruktur,
  74.             sizeof(datenStruktur)
  75.             );
  76.         /*
  77.         *  Dem ersten Parameter wurde dem binärem Operator (char*) eine Referenz von rDatenStruktur übergeben.
  78.         *  Der zweite Parameter besagt, wieviele Bytes ausgelesen werden sollen. Hier wurden umgerechnet 204
  79.         *  übergeben was exakt eine Strukturgröße ist. Der Dateizeiger fängt also bei Byte 816 erst an und
  80.         *  liesst auch nur 204 Bytes bis zum 1020ten Byte. Die Strucktur wird durch die Referenz übertragen.
  81.         *
  82.         */
  83.         stream.close();
  84.         cout << "Name: " << rDatenStruktur.name << "\t\t" \
  85.             << "Nachname: " << rDatenStruktur.Nachname << "\t";
  86.         cout << "Nummer: " << rDatenStruktur.nummer << std::endl;
  87.     }
  88.     else
  89.     {
  90.         stream.clear();
  91.         cout << "StrukturGruppeArray.dat konnte nicht geladen werden!" << std::endl;
  92.     }
  93.  
  94.     getch();
  95.     return EXIT_SUCCESS;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement