• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ pliki binarne

Object Storage Arubacloud
0 głosów
149 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)
char czytaj(string nazwa)
{
    static int licz=-1;
    fstream plik;
    char znak;
    const char* c=nazwa.c_str();

plik.open(c,ios::in|ios::binary);
plik.seekg(0,ios::beg);
///cout<<plik.seekg(0,ios::end);
    while(plik.get()!=EOF)
    {
      licz++;
      plik.seekg(licz,ios::beg);
      plik.read((char*)&znak,sizeof(znak));
      if( (znak==10) ||
          (znak==13) ) znak='$';
      ///cout<<znak<<endl;
      ///
      break;
    }
plik.seekg(0,ios::beg);
plik.close();
plik.clear();
return znak;

}

 

Witam co zrobić, żeby udało się użyć czytaj() w drugiej pętli (serii).

 for(int i=1;i<=liczBajty();i++)cout<<czytaj()<<endl;
 cout<<"============="<<endl;
 for(int i=1;i<=liczBajty();i++)cout<<czytaj()<<endl;

Nie widać drugiej pętli, czyli trzeba chyba jakoś zrestartować bufor czy coś.

Z góry dzięki za pomoc

1 odpowiedź

0 głosów
odpowiedź 27 stycznia 2020 przez tangarr Mędrzec (154,780 p.)
wybrane 27 stycznia 2020 przez Konrad Gałach
 
Najlepsza

Strasznie przekombinowałeś. Za pozycję w pliku odpowiada statyczna zmienna licz. Zmienne statyczne są inicjowane tylko raz, podczas pierwszego użycia funkcji. W kolejnych użyciach funkcji zmienna posiada wartość z poprzedniego wywołania.
Musiałbyś dodać dodatkowy parametr do funkcji, którym byś sterował resetowaniem zmiennej licz.
Wielokrotne otwieranie i zamykanie pliku jest wysoce nieefektywne. Lepiej plik otworzyć raz i przekazywać go do funkcji. Ponadto otwierasz plik w trybie tekstowym.
Nie wiem jak wygląda funkcja liczBajty. Podejrzewam, że służy do pozyskiwania rozmiaru pliku. Chciałbym ci zasugerować troszkę inne podejście do tematu:
 

char czytaj (ifstream &plik)
{
    char znak;
    plik >> znak;
    if (znak == 10 || znak == 13)
	    znak = '$';
    return znak;
}

int liczBajty(ifstream &plik) {
    streampos pos = plik.tellg();
    plik.seekg(0, ios_base::end);
    streampos size = plik.tellg();
    plik.seekg(pos);
    return size;
}

void funkcja(const string &nazwa_pliku) {
    ifstream plik;
    plik.open(nazwa_pliku.c_str(), ios_base::in | ios_base::binary);
    
    int size = liczBajty(plik);
    for(int i=1;i<=size;i++)
        cout<<czytaj(plik)<<endl;
    cout<<"============="<<endl;
    plik.seekg(0);
    for(int i=1;i<=size;i++)
        cout<<czytaj(plik)<<endl;
}

Mam nadzieję, że znajdziesz jakąś inspirację w tym kodzie.

Podobne pytania

0 głosów
1 odpowiedź 276 wizyt
pytanie zadane 24 kwietnia 2018 w C i C++ przez Dudman Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 176 wizyt
pytanie zadane 9 października 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
+1 głos
2 odpowiedzi 201 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez MAXIM7 Obywatel (1,990 p.)

92,537 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,923 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...