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

odczyt z pliku (struktury, lista dwukierunkowa)

Ostatnio zmodyfikowano 2017-01-13 17:03
Autor Wiadomość
mikewazowski
Temat założony przez niniejszego użytkownika
odczyt z pliku (struktury, lista dwukierunkowa)
» 2017-01-11 23:49:49
plik intnieje i jest pusty - komunikat że dane zostają wczytane, jeśli plik zawiera dane to cały program się zawiesza i nie wczytuje danych oraz nie zwraca komunikatu "blad otwarcia pliku"

C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
using namespace std;
struct Dane
{
    string imie;
    string nazwisko;
    string dataur;
    string ulica;
    string miasto;
    string inne;
    int id;
};
struct Student
{
    Dane dane;
    Student * next;
    Student * prev;
    static int num_of_students;
};
int Student::num_of_students = 0;

Student * stworzelement()
{
    Student * element;
    string imie;
    string nazwisko;
    string dataur;
    string ulica;
    string miasto;
    string inne;
    int id = ++Student::num_of_students;
   
    cout << "ID: " << id << endl;
    cout << "podaj imie: ";
    cin >> imie;
    cout << "podaj nazwisko: ";
    cin >> nazwisko;
    cout << "podaj date urodzenia: ";
    cin.sync();
    getline( cin, dataur );
    cout << "podaj ulice i numer domu: ";
    cin.sync();
    getline( cin, ulica );
    cout << "podaj miasto: ";
    cin.sync();
    getline( cin, miasto );
    cout << "podaj inne dane: ";
    cin.sync();
    getline( cin, inne );
   
    element = new Student();
    element->next = NULL;
    element->prev = NULL;
    element->dane.id = id;
    element->dane.imie = imie;
    element->dane.nazwisko = nazwisko;
    element->dane.dataur = dataur;
    element->dane.ulica = ulica;
    element->dane.miasto = miasto;
    element->dane.inne = inne;
   
    return element;
}
int dodajkoniec( Student ** head )
{
    Student * pom;
    if( * head == NULL )
    {
       
        Student * tmp = stworzelement();
        * head = tmp;
        cout << "***dodano do bazy***" << endl;
    }
   
    else
    {
        Student * tmp = stworzelement();
        pom = * head;
       
        while( pom->next != NULL )
        {
            pom = pom->next;
           
        }
        tmp->prev = pom;
        pom->next = tmp;
        cout << "***dodano do bazy***" << endl;
    }
   
}
void odczyt_z_pliku( Student ** head )
{
    string imie;
    string nazwisko;
    string dataur;
    string ulica;
    string miasto;
    string inne;
    int id;
    FILE * wczytaj = NULL;
    string nazwa, nazwa_pliku;
    cout << "podaj nazwe pliku: ";
    cin.sync();
    getline( cin, nazwa );
    nazwa_pliku = nazwa + ".txt";
    Student * tmp, * pom;
    wczytaj = fopen( nazwa_pliku.c_str(), "r" );
    if( wczytaj == NULL )
         cout << "blad otwarcia pliku" << endl;
    else
    {
        while( fscanf( wczytaj, "%s" ) != EOF )
        {
            tmp = new Student();
            tmp->next = NULL;
            tmp->prev = NULL;
            fscanf( wczytaj, "%d" );
            tmp->dane.id = id;
            fscanf( wczytaj, "%s" );
            tmp->dane.imie = imie;
            fscanf( wczytaj, "%s" );
            tmp->dane.nazwisko = nazwisko;
            fscanf( wczytaj, "%s" );
            tmp->dane.dataur = dataur;
            fscanf( wczytaj, "%s" );
            tmp->dane.ulica = ulica;
            fscanf( wczytaj, "%s" );
            tmp->dane.miasto = miasto;
            fscanf( wczytaj, "%s" );
            tmp->dane.inne = inne;
           
            if( * head == NULL )
                 * head = tmp;
            else
            {
                pom = * head;
                while( pom->next != NULL )
                     pom = pom->next;
               
                tmp->prev = pom;
                pom->next = tmp;
            }
        }
        printf( "Plik zostal wczytany" );
    }
    fclose( wczytaj );
}
P-156349
darko202
» 2017-01-12 08:25:29
1.
zapoznaj się z techniką debugowania programu
i nie pisz więcej, że program Ci się zawiesza.

Dowiedz się co faktycznie program robi i która linia sprawia problem

najprostszy debuger to
cout << "zmieniana zmienna";

2.

popatrz na przykład zastosowania fscanf z
http://www.cplusplus.com​/reference/cstdio/fscanf/

fscanf (pFile, "%s", str);
i jak jest u Ciebie - czytasz je, ale gdzie lądują wczytane dane ?

3.
//co będzie gdy w innym miejscu niż warunku "while" przeczytasz EOF
while( fscanf( wczytaj, "%s" ) != EOF )
{
...
            fscanf( wczytaj, "%d" ); //co jak tu przeczytasz EOF
...          
            fscanf( wczytaj, "%s" ); //co jak tu przeczytasz EOF
... 
  //itd. co jak tu przeczytasz EOF
...
}

ewidentnie zła konstrukcja
- w jednym miejscu kodu czytasz z pliku, a potem badasz co przeczytałeś

4.
ja wyżej ale %s w fscanf  oznacza
s String of characters Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.

czyli rodzi się pytanie
co właściwie robią kolejne wywołania fscanf ?

piszę bo nie wiem jak wyglądają dane, czy są odpowiednio sformatowane ?


P-156353
mikewazowski
Temat założony przez niniejszego użytkownika
» 2017-01-13 16:10:37
program zmodyfikowany, ale nadal nie chce zapisywać danych z pliku jako nowe struktury na liscie dwukierunkowej

C/C++
void odczyt()
{
    Student * tmp, * pom, * head;
    string nazwa, nazwa_pliku;
    fstream plik;
   
    cout << "podaj nazwe pliku: ";
    cin.sync();
    getline( cin, nazwa );
    nazwa_pliku = nazwa + ".txt";
    plik.open(( nazwa_pliku ).c_str(), ios::in );
   
   
    if( plik.good() )
    {
        usun_liste( & head ); //usuwanie struktur znajdujących się na liscie by zamiast nich wrzucić te z pliku
        tmp = new Student();
        tmp->next = NULL;
        tmp->prev = NULL;
       
        while( !plik.eof() )
        {
            Student * pom;
            if( * head == NULL )
            {
               
               
                string imie;
                getline( plik, imie );
                tmp->dane.imie = imie;
               
                string nazwisko;
                getline( plik, nazwisko );
                tmp->dane.nazwisko = nazwisko;
               
                int id;
                getline( plik, id );
                cout << "id: " << id;
                tmp->dane.id = id;
               
                string dataur;
                getline( plik, dataur );
                tmp->dane.dataur = dataur;
               
                string ulica;
                getline( plik, ulica );
                //tmp->dane.ulica=ulica;
                string miasto;
                getline( plik, miasto );
                tmp->dane.miasto = miasto;
               
                string inne;
                getline( plik, inne );
                tmp->dane.inne = inne;
               
                * head = tmp;
                cout << "***dodano do bazy***" << endl;
            }
           
            else
            {
               
                tmp = new Student();
                tmp->next = NULL;
                tmp->prev = NULL;
                string imie;
                getline( plik, imie );
                tmp->dane.imie = imie;
                string nazwisko;
                getline( plik, nazwisko );
                cout << "nazwisko: " << nazwisko << endl;
                tmp->dane.nazwisko = nazwisko;
                int id;
                getline( plik, id );
                cout << "id: " << id;
                tmp->dane.id = id;
               
                string dataur;
                getline( plik, dataur );
                tmp->dane.dataur = dataur;
               
                string ulica;
                getline( plik, ulica );
                tmp->dane.ulica = ulica;
                string miasto;
                getline( plik, miasto );
                tmp->dane.miasto = miasto;
               
                string inne;
                getline( plik, inne );
                tmp->dane.inne = inne;
                pom = * head;
               
                while( pom->next != NULL )
                {
                    pom = pom->next;
                   
                }
                tmp->prev = pom;
                pom->next = tmp;
                cout << "***dodano do bazy***" << endl;
            }
           
        }
    }
    plik.close();
}
else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;

}
P-156384
karambaHZP
» 2017-01-13 17:03:12
Debugger i do dzieła.

Tego kodu masz tam z dwa razy za dużo:
C/C++
string ulica;
getline( plik, ulica );
tmp->dane.ulica = ulica;
    |
    |
    v
getline( plik, tmp->dane.ulica );
P-156385
« 1 »
  Strona 1 z 1