Modernes C++ programmieren

Okt 23, 2024

lst-0723-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/evse4x8zK 
#include <vector>
#include <iostream>
#include <cstdio> // fopen, fclose, fwrite, fread, remove
using namespace std;
ostream& operator<<(ostream&os, const vector<int>&data) {
    for(auto &e : data) os << e << ' '; return os;
}
static const char* FILENAME = "nums.dat";
int main() {
  const vector nums{10,11,22,34};
  { // Schreiben
    auto out = fopen(FILENAME, "wb"); // Datei mit C zum Schreiben öffnen
    if(out==nullptr) {
        cerr << "Fehler beim Oeffnen\n"; return -1;
    }
    auto ok = fwrite(nums.data(), sizeof(int), nums.size(), out);
    if(ok!=nums.size()) {
        cerr << "Fehler beim Schreiben\n"; return -1;
    }
    fclose(out); // In C muss man explizit schließen. Ehrlich.
  }
  vector<int> gelesen{};
  { // Lesen
    auto in = fopen(FILENAME, "rb"); // Datei mit C zum Lesen öffnen
    if(in==nullptr) {
        cerr << "Fehler beim Oeffnen\n"; return -1;
    }
    const size_t sz = 4; // angenommen, wir wissen, wir lesen 4 Elemente 
    gelesen.resize(sz);  // Platz schaffen für zu lesende Daten
    auto ok = fread(gelesen.data(), sizeof(int), sz, in);
    if(ok!=sz) {
        cerr << "Fehler beim Lesen\n"; return -1;
    }
    fclose(in);
  }
  { // Vergleichen
    cout << nums << '\n';    // 10 11 22 34
    cout << gelesen << '\n'; // 10 11 22 34
  }
  if(remove(FILENAME) == -1) {
      cerr << "Warning: Fehler beim Loeschen\n";
  }
}