Wątek przeniesiony 2014-02-27 15:29 z C/C++ przez ŁF.

Wczytywanie liczb z pliku do tablicy

0

Czołem, szukałem odpowiedzi w innych tematach, ale nie do końca mi to pomogło.

Mam plik tablica.txt, w którym wpisane są liczby jedna pod drugą, przy czym pierwsza informuje o rozmiarze tablicy:

4 //rozmiar tablicy
10
20
30
40

Nie wiem jak zrobić, żeby odczytał najpierw rozmiar, a później kolejne liczby. Docelowo chcę utworzyć klasę tablica, w której będą funkcje działające na niej i tworzące ją.

Mój kod na teraz:


int tablica[4]; //recznie ustawiam rozmiar
int tmp = 0;
ifstream plik("tablica.txt");

if(!plik) // sprawdza czy zostal otwarty
    { 
        cout << "Blad wczytania" << endl;
        getchar();
        return 1;
    }

while (!plik.eof()) // petla wczytujaca z pliku do tablicy
       plik >> tablica[tmp++]; 

    plik.close();
0

Ale gdzie jest problem? Umiesz odczytać liczbę z pliku? Umiesz, bo to robisz. To odczytaj, stwórz tablicę o danym rozmiarze a potem wczytuj tak jak pokazałeś że umiesz ;]

0

No dobra, najpierw odczytam "4" stworzę tablicę dynamiczną o rozmiarze 4. I później jak zacznę odczytywać, to pierwsza znowu zostanie odczytana "4" i to ona zostanie wpisana do tablicy, problem w tym, że nie wiem jak ją ominąć.

1

Po prostu wyciągnij jeden odczyt przed pętlę ;)

Przykład:

int romiar;

if ( !plik.eof() )
    plik >> romiar;

int* tablica = new int[ rozmiar ];

while ( !plik.eof() && ( tmp < rozmiar ) )
    plik >> tablica[ tmp++ ];
1

Ha nikt nie przyjrzał się co ma w pliku.
Problemem jest komentarz. Wczytujesz liczbę jest ok, potem znowu wczytujesz liczbę, a trafiasz na tekst więc strumień przechodzi w stan błędu i używasz starej wartości zmiennej.
Spróbuj tak:

string komentarz;
int n;
plik >>n;
getline(plik, komentarz);
for (int i=0; i<n; ++i) {
    plik >> tablica[i];
}

albo tak:

string komentarz;
int n, i=0;
plik >>n;
getline(plik, komentarz);
while(plik >> tablica[i]) {
    ++i;
}
0

@MarekR22 Heh, dzięki za chęci, ale komentarz był dla Was, w pliku go nie ma. Faktycznie mogło być to mylące.

@_FURYAN_ To wiele wyjaśnia, jak będę chciał użyć później konstruktora w klasie, to będzie podobnie? Czy lepiej nie przez konstruktor, a przez funkcję?

1

ok ale kod od @_FURYAN_ jest błędny, powinno być tak:

int romiar;
int* tablica = 0;
if ( plik >> romiar) {
     int tmp = 0;
     tablica = new int[ rozmiar ];
     while ((plik >> tablica[tmp]) && (tmp < rozmiar) )
          ++tmp;
     rozmiar = tmp;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0