Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, fstream] Wielokrotne odczytywanie tych samych informacji z otwartego pliku

Ostatnio zmodyfikowano 2013-05-26 09:58
Autor Wiadomość
sprd123
Temat założony przez niniejszego użytkownika
[C++, fstream] Wielokrotne odczytywanie tych samych informacji z otwartego pliku
» 2013-05-25 20:14:06
Witam!

Czy jak chce drugi raz w programie odczytac ten sam plik. wystarczy uruchomic go uzywajac:

np.
C/C++
fstream dane( "dane.bin", ios::binary | ios::in )
czy moze
C/C++
fstream dane( "dane.bin, ios::binary|ios::in|ios::beg)
Jak widac, chodzi mi o to co robi samo ios::in.

Bo wszedzie jest napisane ze pozwala na odczyt pliku, natomiast nie jest nigdzie wyjasnione czy automatycznie ustawia jakby wskaznik na poczatek pliku. Czy trzeba mu pomoc z ios::beg?


Pozdrawiam!

P-83891
pekfos
» 2013-05-25 20:17:08
Aby ustawić pozycję na koniec pliku, trzeba jawnie podać tryb ios::ate lub ios::app. Bez tego plik jest otwierany z pozycją ustawioną na początku.
Poza tym, by ponownie odczytać plik, nie musisz go ponownie otwierać. Wystarczy użyć seekg():
C/C++
dane.seekg( 0 ); //ustawia pozycję odczytu na poczatku pliku
PS: ios::beg to nie jest tryb otwierania pliku.
P-83893
sprd123
Temat założony przez niniejszego użytkownika
» 2013-05-26 09:58:48
Rozumiem.

Zrobilem to troszke inaczej, poruszajac sie seekg ale z ios::beg;

prosze o sprawdzenie mi tego programiku.

Kompiluje sie i dziala. Ale chcialbym z takiego czysto informatycznego spojrzenia dowiedziec sie czy jest ok. Glownie chodzi mi o to przejscie miedzy pierwszym odczytem plik a drugim.

Pozdrawiam serdecznie! :)

C/C++
#include <iostream>
#include <fstream>
using namespace std;

struct miejsc
{
    char miejscowosc[ 40 ];
    float mieszkancy;
};

void utworz_plik()
{
    int i = 0;
    char znak;
    miejsc a;
   
    ofstream dane( "dane.bin", ios::binary );
   
    do
    {
        cout << "Miejscowosc " << i + 1 << ":" << endl << endl;
        cout << "Podaj nazwe:" << endl;
        cin >> a.miejscowosc;
        cout << "Podaj l.mieszkancow:" << endl;
        cin >> a.mieszkancy;
       
        dane.write(( char * ) & a, sizeof( miejsc ) );
       
        cout << "Czy chcesz podac kolejna miejscowosc? , T/t" << endl;
        cin >> znak;
        i++;
    } while( znak == 't' || znak == 'T' );
   
    dane.close();
}

int main()
{
    miejsc b;
    float srednia2;
    int ilosc;
   
    cout << "Witaj w programie!" << endl;
   
    utworz_plik();
   
    fstream dane( "dane.bin", ios::binary | ios::in );
    ofstream srednia( "srednia.txt" );
    ofstream wyszukane( "wyszukane.txt" );
   
    srednia2 = 0;
    ilosc = 0;
   
    while( !dane.eof() )
    {
        dane.read(( char * ) & b, sizeof( miejsc ) );
       
        if( dane.good() )
        {
            srednia2 = srednia2 + b.mieszkancy;
            ilosc++;
        }
    }
   
    if( ilosc > 0 )
    {
        srednia << "Srednia liczba mieszkancow to:" << endl;
        srednia2 = srednia2 / ilosc;
        srednia << srednia2 << endl;
    }
   
    srednia.close();
    dane.clear();
   
    wyszukane << "Miejscowosci, w ktorych l. mieszkancow przekracza srednia to:" << endl;
    dane.seekg( 0, ios::beg );
   
    while( !dane.eof() )
    {
        dane.read(( char * ) & b, sizeof( miejsc ) );
       
        if( dane.good() )
        {
            if( b.mieszkancy > srednia2 )
            {
                wyszukane << b.miejscowosc << endl;
                wyszukane << "l.mieszkancow:" << endl;
                wyszukane << b.mieszkancy << endl << endl;
            }
        }
    }
    dane.clear();
    dane.close();
    wyszukane.close();
   
    return 0;
}
P-83927
« 1 »
  Strona 1 z 1