Jump to content

Archived

This topic is now archived and is closed to further replies.

Althorion

[C++] ifstream - wczytywanie wielu linijek

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...