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

Dwukrotne czytanie pliku c++

Object Storage Arubacloud
0 głosów
296 wizyt
pytanie zadane 17 lutego 2023 w C i C++ przez Buczo4002 Nowicjusz (120 p.)
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<stdio.h>

using namespace std;
int main()
{    
    fstream plik;
    plik.open("quiz.txt",ios::in);
    
    if(plik.good()==false)
    {
        cout<<"nie udało sie otworzyc pliku"<<endl;
        exit(0);
    }
    
    int liczba_linii, liczba_pytan;
    string bierzaca_linia;    
    
    while(!plik.eof())
    {
        getline(plik, bierzaca_linia);
        liczba_linii++;
    }
    
    plik.close();
    
    liczba_pytan=(liczba_linii-2)/6;
    
    string temat, nick;
    string tresc[liczba_pytan];
    string odpA[liczba_pytan], odpB[liczba_pytan], odpC[liczba_pytan], odpD[liczba_pytan];
    string poprawna[liczba_pytan];
    string odpowiedz;
    int punkty;
    
    int nr_linii=1;
    string linia;
    int nr_pytania=0;
    
    plik.open("quiz.txt",ios::in);
    
    if(plik.good()==false)
    {
        cout<<"nie udało sie otworzyc pliku"<<endl;
        exit(0);
    }
    
    while(getline(plik,linia))
    {
        switch(nr_linii)
        {
            case 1: temat=linia; break;
            case 2: nick=linia; break;
            case 3: tresc[nr_pytania]=linia; break;
            case 4: odpA[nr_pytania]=linia; break;
            case 5: odpB[nr_pytania]=linia; break;
            case 6: odpC[nr_pytania]=linia; break;
            case 7: odpD[nr_pytania]=linia; break;
            case 8: poprawna[nr_pytania]=linia; break;
        }
        if(nr_linii==8)
        {
            nr_linii=2;
            nr_pytania++;
        }
        nr_linii++;
    }
    plik.close();
    
    cout<<"Witamy w quizie!"<<endl<<"Liczba pytan zawartych w quizie: "<<liczba_pytan<<endl;
            
    for(int i=0; i<=liczba_pytan-1; i++)
    {            
        cout<<endl<<tresc[i]<<endl;
        cout<<"A. "<<odpA[i]<<endl;
        cout<<"B. "<<odpB[i]<<endl;
        cout<<"C. "<<odpC[i]<<endl;
        cout<<"D. "<<odpD[i]<<endl;
        
        cout<<"twoja odpowiedz: ";
        cin>>odpowiedz;
        
        transform(odpowiedz.begin(),odpowiedz.end(),odpowiedz.begin(), ::tolower);
        
        if(odpowiedz==poprawna[i])
        {
            cout<<"odpowiedz poprawna, zdobywasz punkt"<<endl;
            punkty++;
        }
        else
        {
            cout<<"odpowiedz bledna, poprawna byla: "<<poprawna[i]<<endl;
        }
        
        getchar();getchar();
        system("cls");
    }
    cout<<endl<<"lacznie zdobyte punkty: "<<punkty<<endl;
    
    return 0;
}

Quiz z odcinka 7 z c++ zmodyfikowałem tak żeby sam najpierw odczytał ile jest linii, co za tym idzie, pytań w quizie i zrobił odpowiednią liczbę sekcji w tablicy, nie wiedziałem co zrobić żeby program zaczął czytać linie od początku tak żeby później z tego samego pliku odczytać treść pytań, odpowiedzi itd., więc napisałem żeby najpierw zamknął plik a później znów go otwiorzył, no i jak zrobić to prościej żeby program zaczął czytać od początku i nie musiał otwierać tego samego pliku 2 razy

2 odpowiedzi

+1 głos
odpowiedź 17 lutego 2023 przez polandonion Mądrala (7,040 p.)
a nie możesz zczytując kolejne linie zapisywać je do tablicy / wektora? mam na myśli tablice / wektor stringów

później miałbyś cały plik w jakiejś strukturze i byś po prostu przez nią przechodził od początku do końca
komentarz 17 lutego 2023 przez Buczo4002 Nowicjusz (120 p.)
W sensie na bieżąco dodawać liczbę "szufladek" w tablicy? Jestem świeżakiem i nie ogarniam tak jeszcze dopiero co obejrzałem ten 7 odcinek
komentarz 17 lutego 2023 przez polandonion Mądrala (7,040 p.)

nic trudnego. wystarczy zapoznać się z std::vector. Wektor to nic innego jak tablica, tylko o nieokreślonej wielkości. Oznacza to, że możesz dowolnie podczas programu go zwiększać / zmniejszać.

Najpierw globalnie zadeklaruj wektor (nie w main'ie, zeby nie bylo zadnych smieci w wektorze), nie zapominając o nagłówku #include <vector>

vector <string> v;

a potem podczas wczytywania kolejnych linii z pliku dodatkowo wrzuć to co wczytałeś do wektora, tym sposobem w kolejnosci, w ktorej wczytywales bedziesz mial zapisane wszystkie linie:

while(!plik.eof())
    {
        getline(plik, bierzaca_linia);
        v.push_back(bierzaca_linia); // dodanie do 'tablicy' tej linii
        liczba_linii++;
    }

Dodatkowo nie musisz trzymać zmiennej liczba_linii. Wektor umożliwia dostanie się do jego wielkości, np v.size() wypluje wielkość wektora.

Gorąco polecam zapoznanie się z wektorem.

komentarz 17 lutego 2023 przez polandonion Mądrala (7,040 p.)

jeśli chcesz dostać się do tych linii ponownie, wystarczy przejść przez wektor w taki sposób:

for (int i = 0; i < v.size(); i ++)
     // zrob cos z v[i];

 

1
komentarz 18 lutego 2023 przez j23 Mędrzec (194,920 p.)
while(!plik.eof())
    {
        getline(plik, bierzaca_linia);
        v.push_back(bierzaca_linia); // dodanie do 'tablicy' tej linii
        liczba_linii++;
    }

Poprawne czytanie wygląda tak:

    while(getline(plik, bierzaca_linia)) {
        v.push_back(move(bierzaca_linia)); 
    }

 

0 głosów
odpowiedź 17 lutego 2023 przez tangarr Mędrzec (154,780 p.)

Spójrz w dokumentację szablonu basic_fstream. Znajdziesz tam funkcję seekg.

Podobne pytania

0 głosów
1 odpowiedź 154 wizyt
0 głosów
1 odpowiedź 437 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez Dawid115 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 1,046 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...