Strona 1 z 3 123 OstatniOstatni
Pokaż wyniki 1 do 10 z 28

Temat: Wczytywanie danych z pliku do wektora

  1. #1
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie Wczytywanie danych z pliku do wektora

    Napisalam drobny rogramik, ktory wczytuje dane z pliku do wektora:

    dane.txt:
    Kod:
    1 23 44 556
    2 34 3
    23 321 2 32
    3 0 0 2 22
    main.cpp
    Kod:
    #include<iostream>
    #include<fstream>
    #include<vector>
    #include<string>
    
    using namespace std;
    int main()
    {
        ifstream plik("dane.txt");
        if (! plik) cout<<"Brak pliku 'Data.txt' w katalogu z programem. Sproboj ponownie\n";
    
        int s = 0;
        vector<string> V_s;
        ifstream S("dane.txt");
        string l;
        while (getline(S, l)) V_s.push_back(l);
        for (int i = 0; i < V_s.size(); i++) s++;
        S.close();
    //    V_s.clear();
    
        for (int i=0; i<V_s.size(); i++)
        {
          cout<<"V["<<i<<"]="<<V_s[i]<<endl;
        }
    }
    W ten sposob otrzymuje:
    V[0]=1 23 44 556
    V[1]=2 34 3
    V[2]=23 321 2 32
    V[3]=3 0 0 2 22

    Chcialabym zapytac w jaki sposob powinnam zrobic, aby kazdy element pliku dane.txt byl osobnym elementem wektora, tzn
    V[0]=1
    V[1]= 23
    V[2] =44
    V[3] = 556
    V[4] = 2
    itd.

    Bede wdzieczna za jakiekolwiek wskazowki.

  2. #2
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Post

    Po co otwierasz 2 razy ten sam plik? Sprawdzić czy plik został otwarty i czytać z niego można przy użyciu tego samego obiektu strumienia.

    Cytat Napisał Gosik Zobacz post
    Kod:
        for (int i = 0; i < V_s.size(); i++) s++;
    Nie lepiej po prostu
    Kod:
    s = V_s.size();
    A najlepiej po prostu używać V_s.size() gdzie to potrzebne

    Wczytujesz całymi liniami więc dostajesz całe linie, możesz wczytywać pojedyncze wyrazy
    Kod:
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    using namespace std;
    
    int main()
    {
    	ifstream plik("dane.txt");
    	if(!plik)
    	{
    		cerr << "Brak pliku.";
    		return 1;
    	}
    	vector<string> dane;
    	string x;
    	while(plik >> x)
    		dane.push_back(x);
    	plik.close();
    	return 0;
    }
    lub od razu wczytywać jako liczby (strumienie rozróżniają typy zmiennych)
    Kod:
    	vector<int> dane;
    	int x;
    Możesz też się pobawić algorytmami std i iteratorami
    Kod:
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    int main()
    {
    	ifstream plik("dane.txt");
    	vector<string> dane;
    	copy(istream_iterator<string>(plik), istream_iterator<string>(), back_inserter(dane));
    	plik.close();
    	return 0;
    }
    Podobnie dla liczb
    Kod:
    	vector<int> dane;
    	copy(istream_iterator<int>(plik), istream_iterator<int>(), back_inserter(dane));
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  3. #3
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Moze tablica dwuwymiarowa?
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  4. #4
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Niezmiernie jestem wdzieczna za pomoc!
    Teraz w ramach cwiczen probuje przerobic ten programik na 2 funkcje: wczytujaca dane z pliku i wypisujaca te dane.
    Niestety nie wiem jak taki wektor przekazuje sie do funkcji.
    Rowniez mam problem z wrzuceniem nazwy pliku do funkcji.

    Oto moje proba:
    Kod:
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    using namespace std;
    
    void wczyt_wekt(string nazwapliku,int *s);
    void wypisz(double *dane);
    
    int main()
    {  ifstream dane.txt;
       int s;
    
        wczyt_wekt(dane.txt,&s);
        wypisz(&dane,&s); 
    }    
      
       void wczyt_wekt(ifstream &nazwapliku, int *s)
       {
       
            ifstream plik("dane.txt");
            if(!plik)
            {
                    cerr << "Brak pliku.";
                    return 1;
            }
            vector<string> dane;
            string x;
            while(plik >> x)
                    dane.push_back(x);
            s=dane.size();  // wpisuje ilosc elementow tablicy
            plik.close();
        }
       
        void wypisz(double *dane,*s)
        {
            for (int i=1; i<dane.size(); i++)
            {
          cout<<"V["<<i<<"]="<<dane[i]<<endl;
            }
            cout<<s;
         }
    Czy w tej kwestii moglabym rowniez liczyc na pomoc? Dopiero sie ucze i napotykam wiele problemow, ktore nie wiem jak rozwiazac.
    43,0-1 Bot
    Ostatnio edytowane przez Gosik : 03-17-2013 - 15:51

  5. #5
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Exclamation

    Proponuję zacząć się uczyć od początku i nie przeskakuj do następnej rzeczy dopóki nie zrozumiesz poprzedniej bo wszystko pomieszałaś i wyszedł Ci kompletnie bezsensowny kod.
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  6. #6
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Cytat Napisał Rolek Zobacz post
    Proponuję zacząć się uczyć od początku i nie przeskakuj do następnej rzeczy dopóki nie zrozumiesz poprzedniej bo wszystko pomieszałaś i wyszedł Ci kompletnie bezsensowny kod.
    Swieta racja!

    Zdaje mi sie, ze juz troche ogarnelam temat i nanioslam poprawki na kod.

    Kod:
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    using namespace std;
    
    void wczyt(const char *tekst,vector<string>&wektor);
    void wyswietl(vector<string>&wektor);
    
    int main()
    {
            
            vector<string>w;
            wczyt("dane.txt",w);
            wyswietl(w);
    }
    
            void wczyt(const char *tekst,vector<string>&dane)
            { 
              ifstream plik(tekst);
              if(!plik)
              {
                    cerr << "Brak pliku.";
              }
              string x;
              while(plik >> x)
                    dane.push_back(x);
              plik.close();
            }
    
            void wyswietl(vector<string>&dane)
            {
              for (int i=0; i<dane.size(); i++)
              {
               cout<<"V["<<i<<"]="<<dane[i]<<endl;
              }
           }
    Jednakze mam jeszcze pytanie odnosnie przesylania nazwy pliku do funkcji.
    Pierwotnie probowalam to zrobic w taki sposob:
    Kod:
    void wczyt(string tekst,vector<string>&wektor)
    Dlaczego string w takiej sytuacji nie dziala?

  7. #7
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Domyślnie

    Cytat Napisał Gosik Zobacz post
    Dlaczego string w takiej sytuacji nie dziala?
    Konstruktor ifstreama nie przyjmuje stringa, trochę dziwne ze strony twórców standardu, że nie dali takiej mozliwości ale cóż.
    Na stringu możesz użyć metody .c_str(), która zwraca const char* do przechowywanego wewnętrznie tekstu.
    Kod:
    void wczyt(string tekst, vector<string>& dane)
    { 
    	ifstream plik(tekst.c_str());
    Jako, że nie modyfikujesz stringa z nazwą, możesz zastosować drobną optymalizację
    Kod:
    void wczyt(const string& tekst, vector<string>& dane)
    Ostatnio edytowane przez Rolek : 03-17-2013 - 20:58
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

  8. #8
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Bardzo dziekuje za wszystkie wskazowki, komenarze i objasnienia.

    Teraz zabieram sie za wczytywanie danych z pliku do tablicy dwuwymiarowej.
    Ostatnio edytowane przez Mad_Dud : 03-18-2013 - 19:18

  9. #9
    Zarejestrowany
    Nov 2012
    Postów
    95

    Domyślnie

    Program na wczytywanie liczb do macierzy mam juz zakoczony.
    Jednakze chcialabym sie jeszcze z Wami skonsultowac.

    Mam plik z danymi:
    Kod:
    3  4
    5  6  4 33
    9  10 5 3
    13 14 7 11
    Gdzie w pierwszym wierszu podany jest wymiar macierzy.

    I zrobilam to w nastepujacy sposob:
    1)otworzylam plik
    2)wczytalam pierwszy wiersz jako tab1
    3)storzylam dynamiczna alokacje macierzy tab2
    4)wczytalam dane do macierzy tab2
    5)wypisalam dane
    6)zwolnilam pamiec.

    Chcialabym storzyc funkcje i zastanawiam sie czy rozbic je na 3:
    a) wczytuje dane (punkt. 1-4)
    b) wypisuje dane (pkt.5)
    c)zwolnienie pamieci -> czy moze sie to znajdowac w pkt. a?

    Czy tez lepiej zrobic to w nastepujacy sposob:
    funkcja nr 1: otworzenie pliku, wczytanie pierwszego wiersza, zamkniecie pliku
    funkcja nr 2: utworzenie dynamicznej alokacji pamieci
    funckja nr 3: otworzenie pliku, wczytanie danych do tab2, zamkniecie pliku
    funkcja nr 4: zwolnienie pamieci.

    Bede wdzieczna za wskazanie jak to zrobic, by program byl jakn ajbardziej efektywny.

  10. #10
    Zarejestrowany
    Jan 2008
    Skąd
    za NATem :)
    Postów
    155

    Post

    Cytat Napisał Gosik Zobacz post
    c)zwolnienie pamieci -> czy moze sie to znajdowac w pkt. a?
    Trochę bez sensu, żeby zaraz po załadowaniu danych je usuwać, do niczego ich nie używszy.

    Cytat Napisał Gosik Zobacz post
    Czy tez lepiej zrobic to w nastepujacy sposob:
    funkcja nr 1: otworzenie pliku, wczytanie pierwszego wiersza, zamkniecie pliku
    funkcja nr 2: utworzenie dynamicznej alokacji pamieci
    funckja nr 3: otworzenie pliku, wczytanie danych do tab2, zamkniecie pliku
    funkcja nr 4: zwolnienie pamieci.
    Brzytwa Ockhama
    Poza tym niepotrzebnie dwa razy otwierać i zamykać plik. Możesz raz otworzyć, wczytać wszystko i zamknąć.

    Zazwyczaj robi się funkcję do wczytywania danych, wykonujacą wszystkie potrzebne do tego operacje.
    Jeśli usunięcie danych jest bardziej skomplikowane niż proste zwolnienie pamieci to robi się też do tego funkcję.
    Czasem też tworzy się funkcję do zapisywania danych jeśli taka operacja jest potrzebna.
    Poza tym oczywiście funkcje narzędziowe do operowania na danych, np. może to być ich wypisanie.

    Możesz poczytać Struktury danych i formaty plików, co prawda w części o plikach autor bardziej opisuje bliki binarne i używa WinAPI do ich obsługi, jednak ogólna idea jest taka sama.
    Niniejszy post przedstawia opinie autora w dniu dzisiejszym, na datę jego publikacji. Nie mogą być one wykorzystane przeciwko niemu w dniu jutrzejszym, ani innym następującym po nim dniu. Autor zastrzega sobie prawo do zmiany poglądów bez podawania przyczyn.

Strona 1 z 3 123 OstatniOstatni

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj