Otwieranie pliku+ liczenie linii

0

Dzień dobry,

W moim programie, który wczytuje dane z pliku i pracuje na grafie sprzężonym pojawił się problem- w funkcji main otwieram plik, aby policzyć ilość linii (jest ona równoznaczna z ilością wierzchołków), potem plik zamykam i otwierany jest on ponownie w funkcji odpowiedzialnej za zczytywanie danych do tablicy. Co ciekawe, problem zaczyna się, gdy liczba wierzchołków >5.

Oto istotne fragmenty kodu (w załączniku całość):

int main()
{
    string nazwa;
    string zawartosc;
    int licznik=0;

    //cout<< "Podaj nazwe pliku zawierajacego dane, lacznie z rozszerzeniem:"<<endl;
    //cin>> nazwa;
    nazwa="graf_dane.txt";
    plik.open(nazwa.c_str());
    if( plik.good() != true )
    {
        cout << "Otworzenie pliku jest niemozliwe!" <<endl;
    }
    else
    {
        cout << "Otwieranie pliku zakonczone powodzeniem!" << endl;
       while(getline(plik, zawartosc))          //liczymy ilosc linii=ilosc krawedzi
        {
            licznik++;
        }
        plik.close();
        Graf nasz(licznik, nazwa);

        (...)
      
    }
    return 0;
}



  void zczytaj()                          //zczytanie grafu z pliku
    {

        int a;
        cout<<"sprawdzam1"<<endl;
        plik.open(dane.c_str());            //PROBLEM!
        cout<<"sprawdzam2"<<endl;
        for (int i=0; i<=wierzcholki-1; i++)
        {
            for (int j=0; j<=wierzcholki-1; j++)
            {
                plik>> macierz[i][j];
                if (macierz[i][j]==1)
                    krawedzie++;
            }
        }
        plik.close();

        for (int p=0; p<=wierzcholki-1; p++)                //wypisanie grafu na ekran
        {
            for (int q=0; q<=wierzcholki-1; q++)
                cout<<macierz[p][q];
            cout<<endl;
        }
        cout<<"liczba krawedzi "<<krawedzie<<endl;
    }

Zmienne dane i nazwa przechowują nazwę pliku z danymi podaną przez użytkownika.

I tak: w przypadku więcej niż 5 wierzchołków, w funkcji zczytaj wypisywany jest komunikat "sprawdzam1", a "sprawdzam2" już nie.
Jeżeli w main zakomentuję linijkę z while(getline(plik,zawartosc)) wszystko działa bez problemu (ale nie uzyskuję informacji ile linijek ma plik).

Z czego może wynikać ów problem?
Z góry dziękuję za pomoc

0

Może tą pętle zliczająca ilość linij zrób w taki sposób:

 while(!plik.eof())                                        
        {
                   getline(plik, zawartosc);
      
            licznik++;
        }
  • nie zrobiłeś w swoim kodzie sprawdzania czy jest koniec pliku i to mogło generować błąd :-)
1

Pokaż jak wczytujesz te wierzchołki, przydzielasz pod nie pamięć oraz jak przydzielasz pamięć pod macierz.
W podanym fragmencie kodu wszystko jest ok jeżeli nie liczyć kilku WTF jak: for (int i=0; i<=wierzcholki-1; i++)
zamiast po ludzku: for(int i=0;i<wierzcholki;++i)

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