[solved][C++] wczytywanie liczb z pliku binarnego

0

Witam,
mam dosyć prosty problem, ale coś nie umiem sobie z nim poradzić:
Jest sobie plik binarny z macierzą rzadką; ma on następującą postać (każda kolejna dana ma 4 bajty):

ilość el. niezer. w wierszu ; kolumna ; wartość ; kolumna ; wartość ; ... ; ilość el. niezer. w wierszu ; kolumna ; wartość ; ...

kolumna i ilość el. to inty, a wartości to floaty.

Całość ma być wczytana do trzech wektorów

vector <float> wartosci;
vector <unsigned int> kolumny;
vector <unsigned int> niezerowe;

Ja próbowałem już to czytać ifstreamem - read ([char*] , 4 ) (albo wczytuje jakieś kosmiczne wartości, albo się sypie (exception 3688 - win XP))
oraz freadem (w ogóle jakoś śmiesznie działa, bo niby wczytuje plik, ale chyba nie ten podany).

0

ort! kod ktory zapisuje te wartosci do pliku bo byc moze kolejnosc podana przez ciebie nie jest do konca prawidlowa.

jesli jestes pewny tej kolejnosci odczytu to napisz:

read((char*)przeznaczenie, sizeof(int/float))

0

"Generator" macierzy nie jest mój, ale kolejności jestem pewien, bo sprawdzałem.
Tak samo jak te 4 bajty. Na pewno tak jest to zapisane.

a w readzie cokolwiek wpisze, to się VS debugger włącza i krzyczy, że nieobsłużony wyjątek jest (za każdym razem inny)... Po prostu mi się kończą pomysły...

PS. Właśnie, czy da się jakoś czytać po 4 bajty za pomocą " >> " ?

0

nie lepiej fread i dać wskaźnik na int na przykład? trzeba tylko uważać na endianess

0

moze ort! kod ktorym to odczytujesz

0

Dobra, działa :) metodą prób i błędów udało mi się dojść do najbardziej oczywistego rozwiązania...

ifstream -> read ((char*)&int, 4);
ifstream -> read ((char*)&float, 4);

a co do freada, to próbowałem, ale też coś mi się sypało... W każdym razie dzięki :)

a co do kodu:

  vector <float> mtx_val;  /* kolejne wartości z wczytanej macierzy */
  vector <unsigned int> mtx_col; /* pozycje (kolumny) kolejnych el. niezer. z powyzszego wektora */
  vector <unsigned int> mtx_nzl; /* liczba elementów niezerowych w kolejnych wierszach */

  unsigned long int temp_col;
  float temp_val;
  int temp_nzl;

  ifstream *inp;

  inp = new ifstream ("mtx.bin", ios::binary);

  while (true) {
    inp -> read ((char*)&temp_nzl,4);

    if (inp->eof()) break;

    mtx_nzl.push_back (temp_nzl);

    for (int i = 0; i < temp_nzl; i++) {
      inp -> read ((char*)&temp_col,4);
      inp -> read ((char*)&temp_val,4);

      mtx_col.push_back (temp_col);
      mtx_val.push_back (temp_val);
    }
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1