Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

seekg() pozicioniranje pitanje

[es] :: C/C++ programiranje :: C/C++ za početnike :: seekg() pozicioniranje pitanje

[ Pregleda: 1847 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

galatea

Član broj: 278485
Poruke: 3
*.dsl.iskon.hr.



Profil

icon seekg() pozicioniranje pitanje30.01.2011. u 16:19 - pre 161 meseci
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;
}
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: seekg() pozicioniranje pitanje30.01.2011. u 18:55 - pre 161 meseci
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";


 
Odgovor na temu

galatea

Član broj: 278485
Poruke: 3
*.dsl.iskon.hr.



Profil

icon Re: seekg() pozicioniranje pitanje30.01.2011. u 21:28 - pre 161 meseci
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;
    
    
    }


 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.mts.telekom.rs.



+2790 Profil

icon Re: seekg() pozicioniranje pitanje30.01.2011. u 21:55 - pre 161 meseci
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.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

galatea

Član broj: 278485
Poruke: 3
*.dsl.iskon.hr.



Profil

icon Re: seekg() pozicioniranje pitanje30.01.2011. u 22:07 - pre 161 meseci
pa uvijek kod citanja tak sa datootekama ide..citaj dok ne dodjes do eof...
???
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
89.216.32.*



+2790 Profil

icon Re: seekg() pozicioniranje pitanje31.01.2011. u 09:16 - pre 161 meseci
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;
}

Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
Prikačeni fajlovi
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: seekg() pozicioniranje pitanje

[ Pregleda: 1847 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.