[ galatea @ 30.01.2011. 16:19 ] @
ovako,
trebam procitati nesto iz binarne datoteke ali od 4. bajta.
podatke koje dalje trebam citati citam kao 2bajtne integere:

posto moji podaci trebaju imati negativnu vrijednost dolazim do zakljucka da moj kod ne valja:


Code:
      fstream datafile("file.dat",ios::binary|ios::in);
 
      if (!datafile){
 
      cerr << "Error opening file!"<<endl;
 
      exit(1);

      }


    for(i=4; i<100;i=i+2){

       datafile.seekg(i,ios::beg);

       datafile.read((char*)&dataCount,2*sizeof(char));

 
       cout << dataCount << ";" << endl;
}
[ X Files @ 30.01.2011. 18:55 ] @
Ako sam dobro razumeo, seekg() ti uopste ne treba jer se pokazivac za sledece citanje automatski pomera unapred nakon citanja.

Ukratko:

* Treba da ukljucis biblioteku za rad sa fajl streamovima:
#include <iostream>

* Treba ti Buffer gde ces smestiti dvobajtne vrednosti:
char buff[3]={0};

Ovime smo automatski stavili NULL na poslednji, treci karakter, kako bismo kasnije lakse baratali sa sadrzajem. Ne mora tako ako znas sta ces kasnije sa sadrzajem, tj. ako ga neces ispisivati kao string. Tada je dovoljno: char buff[2];)


* Potrebno je da utvrdis da li je fajl otvoren i da utvrdis da li se stiglo do kraja streama. Usput, treba preskociti prva 4 bajta - citamo dva pa dva, da ne unistimo treci NULL u Bufferu koga smo prethodno pripremili. Kasnije u petlji citamo redom dvobajtne vrednosti, sve do kraja datoteke

Code:

// NETESTIRANO !!!
if ( datafile.is_open() )
{
    // preskacemo 4 bajta
    datafile.read( buff, 2 );
    datafile.read( buff, 2 );

    // dok god je stream ispravan
    while ( datafile.good() )
    {
        datafile.read( buff, 2 );
        // sada ispisujemo sadrzaj da vidimo da li je citanje ispravno, zato nam treba NULL na trecem karakteru
        cout << buff << endl;
    }
    datafile.close();
}
else cout << "Unable to open file";


[ galatea @ 30.01.2011. 21:28 ] @
hej, hvala na odgovoru...
imam jos jedno rjesenje,prvo vidim da mi nije dobro...imam sada ovako:

Code:
      short spremi; // dakle 2 bajta
        int dataCount; // 4 bajta

        datafile.seekg(0,ios::beg);

    datafile.read(reinterpret_cast<char*>(&dataCount),4*sizeof(char)); // tu procita prvih 4 bajta
    
    
    
//odje cita daljnjih 2 do kraja...al opet nisam sigurna da li je ova sintaxa ok    

        while(!datafile.eof()){
          datafile.read(reinterpret_cast<char*>(&spremi),2*sizeof(char));
    
    
           cout << spremi << endl;
    
    
    }


[ Nedeljko @ 30.01.2011. 21:55 ] @
Umesto while(!datafile.eof()) {...} treba ti nešto ovako:

Code:
while(true) {
    datafile.read((char*) &spremi, 2);

    if (datafile.eof()) {
        break;
    }

    cout << spremi << endl;
}


zato što se eof postavlja na true tek nakon neuspelog čitanja, a ne pred pokušaj koji ne može da uspe.
[ galatea @ 30.01.2011. 22:07 ] @
pa uvijek kod citanja tak sa datootekama ide..citaj dok ne dodjes do eof...
???
[ Nedeljko @ 31.01.2011. 09:16 ] @
Evo ti, pa probaj sama.

Code:
#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream in("input.dat");

    if (in) {
        while (true) {
            int16_t num;

            in.read((char*) &num, 2);

            if (in.eof()) {
                break;
            }

            cout << num << endl;
        }
    } else {
        cout << "File is not opened" << endl;
    }

    return 0;
}