Pokaż wyniki 1 do 10 z 28

Temat: Wczytywanie danych z pliku do wektora

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1

    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

    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

    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 - 14:51

  5. #5

    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

    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

    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 - 19: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.

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