Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Struktury i odczyt z pliku

Ostatnio zmodyfikowano 2017-01-26 10:01
Autor Wiadomość
ManiekB
Temat założony przez niniejszego użytkownika
Struktury i odczyt z pliku
» 2017-01-25 21:17:56
Witam. Mam problem z programem wrzuconym poniżej. Program z pliku tekstowego ma wczytywać do tablicy struktur imiona i nazwiska osób, a następnie zwrócić ile z tych osób ma nazwisko na literę podaną przez użytkownika. Program się kompiluje bez problemu, lecz po odpaleniu i podaniu zmiennej n mniejszej od 6 (ilość osób które chcemy wczytać) to program przestaje działać. Ktoś ma pomysł co może być nie tak?

 
C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdlib.h>
using namespace std;
struct data
{
    string imie;
    string nazwisko;
   
};
int funkcja( data * tablica, char a, char b, int n )
{
    int licznik = 0;
    for( int i = 0; i < n; i++ )
    {
        if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b )
             licznik++;
       
    }
   
    return licznik;
}


int main()
{
    int i = 0, n;
    char a, b;
    cout << "Ile osob?" << endl;
    cin >> n;
    data * tab = new data[ n ];
    fstream plik;
    plik.open( "doc.txt", ios::out | ios::in );
    if( plik.good() == true )
    {
        cout << "Otwarto plik" << endl;
    } else { cout << "Nie mozna otworzyc pliku"; }
   
    while( !plik.eof() )
    {
        getline( plik, tab[ i ].imie, ' ' );
        getline( plik, tab[ i ].nazwisko );
        i++;
    }
    cout << "Wprowadź literki ";
    cin >> a >> b;
    data * wsk = tab;
    int ile = funkcja( wsk, a, b, n );
   
    cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl;
   
    plik.close();
    return 0;
}
.
P-156949
mateczek
» 2017-01-26 10:01:56
Twój błąd polega na tym, że nie sprawdzasz przekroczenia tablicy. Wpisujesz cały plik nawet gdy w tablicy nie masz miejsca
C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdlib.h>
using namespace std;
struct data
{
    string imie;
    string nazwisko;
   
};

// taki dodatek pozwalający wczytać strukturę
istream & operator >>( istream & plik, data & d ) {
    return plik >> d.imie >> d.nazwisko;;
}

int funkcja( data * tablica, char a, char b, int n )
{
    int licznik = 0;
    for( int i = 0; i < n; i++ )
    {
        if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b )
             licznik++;
       
    }
   
    return licznik;
}


int main()
{
    int n;
    char a, b;
    ifstream plik( "doc.txt" ); // plik do czytania można chyba tak
    //plik.open( "doc.txt", ios::out | ios::in );
    if( plik )
    {
        cout << "Otwarto plik" << endl;
    } else {
        cout << "Nie mozna otworzyc pliku";
        return 0; //chyba nie chcesz pracować na pliku który nie jest otwarty ??
    }
   
    cout << "Ile osob?" << endl;
    cin >> n;
    data * tab = new data[ n ];
   
   
    int counter = 0;
    //musisz sprawdzić dwa warunki nie jeden
    //nie możesz czytać całego pliku do tablicy która ma mniejszy rozmiar!!!
    while(( counter < n ) &&( plik >> tab[ counter++ ] ) ); //co skończy się najpierw plik czy rozmiar tablicy !!!
   
   
    cout << "Wprowadź literki ";
    cin >> a >> b;
    int ile = funkcja( tab, a, b, n );
    cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl;
    return 0;
}

jak chcesz wczytać cały plik to najwygodniej użyć std::vector (bo nie musisz deklarować rozmiaru tablicy)

C/C++
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
struct data
{
    string imie;
    string nazwisko;
   
};

// taki dodatek pozwalający wczytać strukturę
istream & operator >>( istream & plik, data & d ) {
    return plik >> d.imie >> d.nazwisko;;
}

int funkcja( vector < data > tablica, char a, char b )
{
    int licznik = 0;
    for( size_t i = 0; i < tablica.size(); i++ )
    {
        if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b )
             licznik++;
       
    }
   
    return licznik;
}


int main()
{
    char a, b;
    ifstream plik( "doc.txt" ); // plik do czytania można chyba tak
    if( plik )
    {
        cout << "Otwarto plik" << endl;
    } else {
        cout << "Nie mozna otworzyc pliku";
        return 0; //chyba nie chcesz pracować na pliku który nie jest otwarty ??
    }
    vector < data > tablica;
    data tempObj;
    while( plik >> tempObj ) { //czytam plik do końca
        tablica.push_back( tempObj ); //odczytany element ładuje do tablicy
    }
    cout << "Wprowadź literki ";
    cin >> a >> b;
    int ile = funkcja( tablica, a, b );
    cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl;
    return 0;
}
P-156961
« 1 »
  Strona 1 z 1