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

[C++] Wczytywanie i zapisywanie danych do pliku - w jednym z kilku przypadków operacji na plikach dane nie zapisują się do pliku.

Ostatnio zmodyfikowano 2013-09-29 22:00
Autor Wiadomość
barti2287
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie i zapisywanie danych do pliku - w jednym z kilku przypadków operacji na plikach dane nie zapisują się do pliku.
» 2013-09-29 17:46:28
Witam. W funkcji, która powinna wczytywać oceny z pliku, dodawać do nich wprowadzone przez użytkownika, obliczać średnią i zapisywać te dane do pliku pojawił się błąd, tzn. kiedy uruchomię konsolę wszystko jest dobrze, ale kiedy przeglądam pliki okazuje się, że zapisane, bądź raczej nadpisane, zostały tylko średnia i ilość ocen. Plik z ocenami pozostał taki sam, mimo wyraźnej instrukcji (i braku errorów ze strony kompilatora).

Poniżej wklejam dwa fragmenty kodu: pierwszy z funkcją, a drugi z jej wywołaniem. Bardzo proszę o szybką pomoc.

C/C++
float srg_nowe_oceny_dodaj( string np2, string np3, string np4 )
{
    int iod, iop, io, i;
    string np;
    float soc[ 30 ], noc[ 30 ], sr;
   
    soc[ 29 ] = 0;
    noc[ 29 ] = 0;
   
    cout << "Podaj ilosc dodawanych ocen: ";
    cin >> iod;
   
    fstream wczytaj_iop( np4.c_str(), ios::in | ios::out );
    if( wczytaj_iop.good() )
    {
        wczytaj_iop >> iop;
       
        wczytaj_iop.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    io = iop + iod;
   
    cout << "Podaj oceny: ";
    for( i = 0; i < iod; i++ )
    {
        cin >> noc[ i ];
    }
   
    fstream dodaj_nowe_oceny( np2.c_str(), ios::in | ios::out );
    if( dodaj_nowe_oceny.good() )
    {
        for( int i = 0; i < iop; i++ )
        {
            dodaj_nowe_oceny >> soc[ i ];
            cout << "Ocena " << i + 1 << ": " << soc[ i ] << "\n";
            soc[ 29 ] = soc[ 29 ] + soc[ i ];
        }
       
        for( int i = 0; i < iod; i++ )
        {
            dodaj_nowe_oceny << noc[ i ] << " ";
            cout << "Ocena " << iop + i + 1 << ": " << noc[ i ] << "\n";
            noc[ 29 ] = noc[ 29 ] + noc[ i ];
        }
        dodaj_nowe_oceny.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    sr =( soc[ 29 ] + noc[ 29 ] ) / io;
   
    fstream dodaj_nowa_srednia( np3.c_str(), ios::in | ios::out | ios::trunc );
    if( dodaj_nowa_srednia.good() )
    {
        dodaj_nowa_srednia << sr;
        dodaj_nowa_srednia.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    fstream dodaj_nowa_io( np4.c_str(), ios::in | ios::out | ios::trunc );
    if( dodaj_nowa_io.good() )
    {
        dodaj_nowa_io << io;
       
        dodaj_nowa_io.close();
    } else cout << "Dostep do pliku zabroniony!";
   
    cout << "\nNowa Ilosc Ocen: " << io << "\n";
    cout << "Nowa Srednia: ";
    return sr;
}
C/C++
case 2:
{
    cout << srg_nowe_oceny_dodaj( np2, np3, np4 );
    cout << "\n\n";
    goto start;
    break;
}

@edit Jeśli ktoś chce mogę wrzucić cały kod.
P-92880
barti2287
Temat założony przez niniejszego użytkownika
» 2013-09-29 22:00:48
Znalazłem rozwiązanie! Wystarczyło zamknąć plik, a potem otworzyć go jeszcze raz i dopiero wtedy zapisać oceny do pliku. Dla ludzi mających ten sam problem wklejam poniżej całą funkcję:

C/C++
float srg_nowe_oceny_dodaj( string np2, string np3, string np4 )
{
    int iod, iop, io, i;
    string np;
    float soc[ 30 ], noc[ 30 ], sr;
   
    soc[ 29 ] = 0;
    noc[ 29 ] = 0;
   
    cout << "Podaj ilosc dodawanych ocen: ";
    cin >> iod;
   
    fstream wczytaj_iop( np4.c_str(), ios::in | ios::out );
    if( wczytaj_iop.good() )
    {
        wczytaj_iop >> iop;
       
        wczytaj_iop.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    io = iop + iod;
   
    cout << "Podaj oceny: ";
    for( i = 0; i < iod; i++ )
    {
        cin >> noc[ i ];
    }
   
    fstream dodaj_nowe_oceny( np2.c_str(), ios::in | ios::out );
    if( dodaj_nowe_oceny.good() )
    {
        for( int i = 0; i < iop; i++ )
        {
            dodaj_nowe_oceny >> soc[ i ];
            cout << "Ocena " << i + 1 << ": " << soc[ i ] << "\n";
            soc[ 29 ] = soc[ 29 ] + soc[ i ];
        }
       
        for( int i = 0; i < iod; i++ )
        {
            cout << "Ocena " << iop + i + 1 << ": " << noc[ i ] << "\n";
            noc[ 29 ] = noc[ 29 ] + noc[ i ];
        }
        dodaj_nowe_oceny.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    dodaj_nowe_oceny.open( np2.c_str(), ios::app );
    if( dodaj_nowe_oceny.good() )
    {
        for( int i = 0; i < iod; i++ )
        {
            dodaj_nowe_oceny << noc[ i ] << "\n";
        }
       
        dodaj_nowe_oceny.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
   
    sr =( soc[ 29 ] + noc[ 29 ] ) / io;
   
    fstream dodaj_nowa_srednia( np3.c_str(), ios::in | ios::out | ios::trunc );
    if( dodaj_nowa_srednia.good() )
    {
        dodaj_nowa_srednia << sr;
        dodaj_nowa_srednia.close();
    } else cout << "Dostep do pliku zabroniony!\n\n";
   
    fstream dodaj_nowa_io( np4.c_str(), ios::in | ios::out | ios::trunc );
    if( dodaj_nowa_io.good() )
    {
        dodaj_nowa_io << io;
       
        dodaj_nowa_io.close();
    } else cout << "Dostep do pliku zabroniony!";
   
    cout << "\nNowa Ilosc Ocen: " << io << "\n";
    cout << "Nowa Srednia: ";
    return sr;
}
P-92896
« 1 »
  Strona 1 z 1