Reklama
Pokazuje wyniki od 1 do 9 z 9

Temat: [C++] Wczytywanie z pliku do tablicy

  1. #1

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny [C++] Wczytywanie z pliku do tablicy

    Siema, potrzebuje wczytać liczby z pliku tekstowego (jedna liczba pod druga) do tablicy dynamicznej

    Kod :
    #include <fstream>
    #include <iostream>
    
    using namespace std;
    int main()
    {
    	cout << "podaj wielkosc tablicy";
    	int size;
    	int tmp=0;
    	cin >> size;
    	int *tab = new int[size];
    	   
        ifstream liczby("liczby.txt");
        
        while (!liczby.eof())
        liczby >> tab[tmp++];  
            
        liczby.close();
        
        for (int i=0; i<tmp; i++)
             cout << tab[i] << endl;
    
        getchar();
    	system("pause");
        return 0;
    }
    mam jednak dwa problemy
    1. jak sprawdzić ile wierszy jest w pliku by program automatycznie nadal odpowiednia wielkosc tablicy? nie tak jak jest obecnie - uzytkownik podaje wielkosc i jezeli okaze sie ona za mala to po prostu wyskakuje masa bledow
    2. czemu gdy program wystwietli wszystkie liczby to i tak na koncu konsoli podaje jakis adres(?) typu -33689...

    edit#
    próbuje użyć czegoś takiego
    Kod :
    ifstream liczby("liczby.txt");
    	int size;
    	size=ftell(liczby.txt);
    	int *tab = new int[size];
    niestety wyskakuje
    error C2039: 'txt' : is not a member of 'std::basic_ifstream<_Elem,_Traits>'
    1> with
    1> [
    1> _Elem=char,
    1> _Traits=std::char_traits<char>
    1> ]
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    Ostatnio zmieniony przez hefalump : 24-03-2014, 14:33

  2. #2

    Data rejestracji
    2007
    Położenie
    Warszawa, karton nr 4
    Posty
    54
    Siła reputacji
    19

    Domyślny

    StackOverflow: Twoje pierwsze źródło informacji:
    https://stackoverflow.com/questions/...es-in-a-text-c
    co do drugiego pytania nie mam teraz czasu patrzec na kod
    Quixo napisał:
    Więc w naszym kraju naprawde są bezmózgi mózyczne?

  3. #3
    konto usunięte

    Domyślny

    "size=ftell(liczby.txt);"

  4. Reklama
  5. #4
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    5
    Posty
    16,986
    Siła reputacji
    29

    Domyślny

    Cytuj hefalump napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    2. czemu gdy program wystwietli wszystkie liczby to i tak na koncu konsoli podaje jakis adres(?) typu -33689...
    Usuń puste linie bądź spacje na końcu pliku liczby.txt (lub cokolwiek się tam znajduje). Zgodnie z twoim kodem plik tekstowy powinien się kończyć od razu za ostatnią liczbą i wtedy powinno być ok.

  6. #5

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    Doczytalem teraz instrukcje co do programu i rozmiar tablicy ma determinowac 1wsza liczba w pliku, czyli 1wsza liczba w pliku jest iloscia wszystkich liczb.
    Jakies pomysly jak pobrac 1wsza linijke z pliku by wstawic te wartosc jako wielkosc tablicy? nie bardzo wiem jak za to sie zabrac..

    2ga sprawa, chce do tablicy dodac obiekt (na razie na jej poczatek)
    wykombinowałem coś takiego
    Kod :
    for(int i=0;i<=size;i++)
    	{
    		tab[i++]=tab[i];
    	}
    	tab[0]=war;
    nie wiem czy dobrze rozumiem... petla for zaczynajac od i=0, do tab[1] przypisuje tab[0], do tab[2]->tab[1] itd, a na końcu do tab[0] przypisuje wartosc zadana (czyli to co dodajemy do tablicy). Tyle ze wynik jest zly, bo po prostu zamienia 1wsza liczbe, a nie rozszerza tablicy.. kolejna sprawa ze co zrobic z faktem iz tablica jest zadeklarowana na np. 10 miejsc a ja dodaje kolejne? jak to rozwiazac?

  7. #6

    Data rejestracji
    2007
    Położenie
    Warszawa, karton nr 4
    Posty
    54
    Siła reputacji
    19

    Domyślny

    pierwszą linijkę z pliku możesz pobrać funkcją getline.
    Co ma robić ta pętla? Rozpisz to bez jakiś zagnieżdżonych funkcji, bo na twoim poziomie sam nie wiesz, co napisałeś, co ta funkcja robi i w jakiej kolejności się wykonują operacje. Niech Cię nie martwi, że się wolniej robi, bo kompilator i tak to zoptymalizuje. Poza tym, wątpię, żebyś chciał iterować aż do size włącznie. Jest konwencja, że podaje się przedział lewostronnie domknięty, więc zawsze się iteruje mniej więcej tak:
    Kod :
    for (auto i = begin; i < end; i++) {
    }
    podejrzewam, że jeszcze wychodzisz poza zakres tablicy przez
    Kod :
     i <= size
    Nie dostajesz signal11 przez to, a szkoda. Na początku dobrze by było, gdybyś nauczył się pisać Pascalu, Pascal nie wybacza i wyłapuje wszystkie takie błędy, bije po łapach za hacki itd.

    Jeśli chcesz rozszerzać tablicę - polecam std::vector lub sam sobie zaimplementuj coś w ten deseń - "jak za mała tablica to zaalokuj x razy większą i przerzuć elementy do poprzedniej tablicy do nowej". Tablice mają stały rozmiar, więc bez realokowania pamięci i kopiowania danych nie da się tego osiągnąć. Niby kopiowanie danych brzmi strasznie, ale zamortyzowany czas operacji włóż_na_koniec() i wyciągnij_z_końca() wychodzi stały, jeśli tablica xkrotnie zwiększa/zmniejsza swoją długość.
    Ostatnio zmieniony przez KishonyOgurek : 27-03-2014, 14:28
    Quixo napisał:
    Więc w naszym kraju naprawde są bezmózgi mózyczne?

  8. Reklama
  9. #7
    Avatar ***Sektum***
    Data rejestracji
    2008
    Posty
    493
    Siła reputacji
    17

    Domyślny

    Ogarnąłem coś takiego. Odczytuje plik z liczbami tylko, że jako char i nie w tablicy dynamicznej. I liczy ilość linii tak jak chciałeś i podaje. Może Ci to w czymś pomoże ;3

    Kod :
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main() 
    {
    
    ifstream plik;
    char ln[50];
    int licz;
    licz=0;
    
    plik.open("liczby.txt");
    
    if(plik.good())
     {
    	while(!plik.eof())
    	{
    		plik>>ln;
    		cout<<ln<<endl;
    		++licz;
    	}
     }
    
    plik.close();
    cout<<"Ilosc linii: "<<licz<<endl;
    
    
    	return 0;
    }
    Ostatnio zmieniony przez ***Sektum*** : 26-03-2014, 21:43

  10. #8

    Data rejestracji
    2009
    Posty
    313
    Siła reputacji
    16

    Domyślny

    po wielu próbach i niepowodzeniach postanowiłem użyć vector'ów... niby wszystko fajnie, jednak z 1 rzeczą mam problem
    Kod :
    #include<iostream>
    #include<fstream>
    #include<vector>
    #include<string>
    #include<time.h>
    
    using namespace std;
    
    int main()
    {
    	clock_t start, koniec;
    
    	start=clock();
    	
    	//wczytywanie z pliku do tablicy
        ifstream plik("liczby.txt");
        
        int s = 0;
        vector<string> tab;
        ifstream S("liczby.txt");
        string l;
        while (getline(S, l)) tab.push_back(l);
        for (int i = 0; i < tab.size(); i++) s++;
        S.close();
    	
    	koniec=clock();
    
    	long delta=(long)(koniec-start);
    	cout<<endl<<"time: "<<delta<<"ms"<<endl;
    
    	//dodawanie na koniec tablicy
    	string dodaj_koniec_t;
    	cout<<endl<<"jaka wartosc dodac na koniec tablicy?";
    	cin>>dodaj_koniec_t;
    
    	tab.push_back(dodaj_koniec_t);
    
    	//wyswietlanie tablicy
        for (int i=0; i<tab.size(); i++)
        {
          cout<<"tab["<<i<<"]="<<tab[i]<<endl;
        }
    	
    	system("pause");
    }
    Wszystko w taki sposob dziala (funkcje clock licza czas operacji, nie z tym akurat mam problem).
    Jednak sęk w tym, że typ vectora ustawiony jest na string, a powinienem użyć tutaj int'ów... zwykła zmiana string->int powoduje wysypanie się masy błędów typu
    std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'std::basic_istream<_Elem,_Traits> &' from 'std::ifstream'
    1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(479) : see declaration of 'std::getline'
    jakieś pomysły jak to rozwiązać?

  11. #9
    konto usunięte

    Domyślny

    Przed push_backiem, musisz skonwertowac l na inta (http://www.cplusplus.com/reference/cstdlib/atoi/). Polecam, czytac kompunikaty :)

  12. Reklama
Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. C++ Wczytywanie z pliku + tworzenie pliku
    Przez Kokolik w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 01-12-2014, 20:13
  2. [C] Wczytywanie danych z pliku do listy jednokierunkowej
    Przez Manufactury w dziale Programowanie
    Odpowiedzi: 5
    Ostatni post: 16-12-2013, 01:02
  3. C++ / wczytywanie znaków
    Przez Rollercoster w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 01-12-2013, 13:22
  4. długie wczytywanie lola
    Przez Obożetojestzboże w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 2
    Ostatni post: 04-08-2012, 00:23
  5. Odpowiedzi: 0
    Ostatni post: 01-12-2010, 19:05

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •