Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Althorion

[C++] ifstream - wczytywanie wielu linijek

Polecane posty

Witam.

Chcę wczytać do programu dane z pliku tekstowego, które są w nim zapisane w następujący sposób:

liczba naturalna n
n wierszy po n+1 liczb całkowitych

gdzie n <= 5.

Rzecz banalna, ale b. dawno nie pisałem w C++ i nigdy nie wczytywałem danych na strumieniach. Stworzyłem taki fragment kodu:

    double tablica[5][4];

    int rozmiar;

    

    ifstream wejscie;                         //definicja egzemplarza opiektu klasy ifstream

    wejscie.open("wej.txt");               //otwarcie pliku wejscia

    wejscie >> rozmiar;                    //wczytanie pierwszej liczby
    

    for (int i = 0; i++; i < rozmiar + 1)

    {

        for (int j = 0; j++; j < rozmiar)

        {

            wejscie >> tablica[i][j];

        }

    }

Jednak wczytuje on tylko pierwszą liczbę (do zmiennej rozmiar). Następujące po niej liczby nie są wczytywane. Podejrzewam, że program przestaje wczytywać po napotkaniu znaku końca linii. Jak należy zmodyfikować program, żeby działał tak, jak w założeniu? Nie chcę chcę używać fscanf ani podobnych wynalazków.

Link do komentarza
Udostępnij na innych stronach

Skoro pracujesz na liczbach całkowitych, dlaczego używasz tablicy typu double?

Skoro n jest czytane, tablica powinna być tworzona dynamicznie, a nie na sztywno (do tego z błędem, bo liczba kolumn jest o 1 mniejsza niż wierszy, a wg opisu pliku powinno być odwrotnie).

Na Twoim miejscu sprawdziłbym też, jak się poprawnie robi pętlę for.

Link do komentarza
Udostępnij na innych stronach

1) Z for faktycznie się wygłupiłem. Tak to jest, jak się długo czegoś nie robi a potem rzuca na głęboką wodę. Dzięki.

2) Tablicę wyłapałem i poprawiłem.

3) Double'a potrzebuję, gdyż te liczby będę potem jeszcze m.in. pierwiastkował.

4) Zastanawiałem się nad dynamiczną, ale uznałem, że przy tak mikroskopijnych danych wejściowych - nie chce mi się.

Ale całość dalej mi nie bardzo chce działać. Zrobiłem teraz coś mniej-więcej takiego, żeby sprawdzić czy mi właściwa część działa:

int main()

{

    double tablica[4][6];            //dodatkowa kolumna na liczbe poczatkowych zer

    int rozmiar;

    

    ifstream wejscie;                      //definicja egzemplarza opiektu klasy ifstream

    wejscie.open("wej.txt");               //otwarcie pliku wejscia

    wejscie >> rozmiar;                    //wczytanie pierwszej liczby
    

    for (int i = 0; i < rozmiar + 1; i++)

    {

        for (int j = 0; j++; j < rozmiar)

        {

            wejscie >> tablica[i][j];

        }

    }
    
    //sprawdzamy, czy cos jeszcze zepsulem:

    cout << rozmiar;

    for (int i = 0; i < rozmiar + 1; i++)

    {

        for (int j = 0; j++; j < rozmiar)

        {

            cout << tablica[i][j];

        }

    }    

    

    return 0;

}

I wyświetla, tak jak ostatnio, tylko ROZMIAR, tablicę olewa.

Link do komentarza
Udostępnij na innych stronach

Popraw pętle for, ciągle jest źle.

using namespace std;

int main()
{
double tablica[5][4];

int rozmiar;



ifstream wejscie; //definicja egzemplarza opiektu klasy ifstream

wejscie.open("wej.txt"); //otwarcie pliku wejscia
if (false == wejscie.is_open())
{
return 1;
}

wejscie >> rozmiar; //wczytanie pierwszej liczby


for (int i = 0; i < rozmiar + 1; i++)

{

for (int j = 0; j < rozmiar; j++)

{

wejscie >> tablica[i][j];

}

}

return 0;
}

Link do komentarza
Udostępnij na innych stronach

Sorry, że się wtrącę ale coś mnie zdziwiło: czy linijki

if (false == wejscie.is_open())

nie można zapisać

if (!wejscie.is_open()) ?

Szczerze mówiąc nigdy w życiu nie widziałem takiej konstrukcji i się zaciekawiłem czy to tylko kwestia maniery, czy są jakieś różnice w znaczeniu? ;)

Link do komentarza
Udostępnij na innych stronach

Taka maniera, w porównaniach, o ile to tylko możliwe, stała (ogólnie r-value) z lewej strony. No i siłą rzeczy nie pomijam 0 / false.

Przestałem korzystać z takich zapisów jak ten przytoczony przez Ciebie, bo są mniej czytelne i łatwo o pomyłkę:

if (a = 0)

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...