binär datei handling



  • ich habe zwei methoden geschrieben, die eine binärdatei schreiben und lesen sollen. jetzt habe ich das problem, dass zwar werte geschrieben werden, nehme mal an, dass es funktioniert, jedoch beim lesen probleme auftreten, wo ich nun nicht mehr weiter weiss. nachfolgend hab ich den code kopiert.
    genauer gesagt habe ich zwei probleme:
    1. wenn ich drei werte in eine datei schreibe, ist der erste wert der ausgegeben wird -1.07374e+008, dann wird die erste und zweite eingegebene zahl ausgegeben, die dritte zahl ist verschwunden. anstelle dieser folgt -4.31602e+008, obwohl ich als anzahl der arrays 3 eingegeben habe.
    2. bei der methode rBinFile habe ich versucht die anzahl der gespeicherten aus einer datei zu lesen, jedoch entsteht eine endlos schleife. code steht unter den kommentarzeichen.

    ich hoffe dass mir jemand helfen kann. vielen dank schon im vorhinein. mattias.

    bool CFile::wBinFile(char *fName, float value[], int elements) {
       dat_out.open(fName, ios::out);
       if (!dat_out) {
          cerr << "Datei konnte beim Schreiben nicht geöffnet werden!\n";
                    return false;
       }
       else {
          dat_out.write((char *) value, sizeof(float) * elements);
          dat_out.close();
                    return true;
       }
    }
    
    bool CFile::rBinFile(char *fName, CValue *val, int elements) {
       char sign;
       dat_in.open(fName, ios::in);
       float *values = new float[elements];
    //   dat_in.seekg(0, ios::beg);
    //   cout << "Seek Punkt: " << dat_in.tellg() << endl;
    /*   while(!dat_in.eof()) {
          n++;
          dat_in.seekg(dat_in.tellg() + sizeof(class CValues));
          cout << dat_in.tellg();
       }*/
       if (!dat_in) {
          cerr << "Datei konnte beim Lesen nicht geöffnet werden!\n";
          return false;
       }
       else {
          int loop = 0;
          while (!dat_in.eof()) {
             dat_in.read((char *) &values[loop], sizeof (float));
             loop++;
          }
          for (int i=0; i<loop; i++)
             cout << values[i] << endl;
          cout << loop << endl;
       }
       dat_in.close();
       return true;
    }
    

    Bitte Code-Tags verwenden!

    [ Dieser Beitrag wurde am 31.03.2003 um 23:50 Uhr von HumeSikkins editiert. ]



  • drei sachen die ich zu bemängeln habe,
    die streams der stl sind nicht copierbar. in deinen bsp ist ein stream ein member in CFile (wenn du in CFile dafür sorgst das der stream nicht copiert wird dann war entschuldige)

    wenn du mit binärt daten arbeitest dann benutze das ios::binary flag,

    und nummer drei,

    |1|2|3|4|
    

    stelle dir vor 1-4 sind bytes in einer datei

    amanfang steht der lesser zeiger auf 1

    |1|2|3|4|
     ^
    // eof() == false
    

    nach einen get() dann

    |1|2|3|4|
       ^
    // eof() == false
    

    nach einen get() dann

    |1|2|3|4|
         ^
    // eof() == false
    

    nach einen get() dann

    |1|2|3|4|
           ^
    // eof() == false
    

    nach einen get() dann

    |1|2|3|4|
             ^
    // eof() == false
    // wow eof ist immer noch false
    

    erst wenn du jetzt get() machts wird eof() == true (das get() liefert dir aber nur irgend welchen müll)

    jetzt muss du die schleife etwas umarbeiten


Log in to reply