[C++, fstream] Wielokrotne odczytywanie tych samych informacji z otwartego pliku
Ostatnio zmodyfikowano 2013-05-26 09:58
| 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. fstream dane( "dane.bin", ios::binary | ios::in )
czy moze 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! | 
|  | 
| 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() : PS: ios::beg  to nie jest tryb otwierania pliku. | 
|  | 
| 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! :) #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;
 }
 
 | 
|  | 
| « 1 » |