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

c++ Wyświetlanie danych i dziwne znaczki

Ostatnio zmodyfikowano 2017-01-22 20:18
Autor Wiadomość
xien
Temat założony przez niniejszego użytkownika
c++ Wyświetlanie danych i dziwne znaczki
» 2017-01-22 13:51:19
Możecie mi wyjaśnić dlaczego wyświetla jakieś takie dziwne znaczki gdy uruchamiam program? Wyczytałem coś że może to być związane z tym że program nie wie gdzie ma skończyć czytać plik i nie wiem jak się tego pozbyć, poza tym jakoś tak dziwnie się mieszają i powtarzają, nie wiem czym to jest spowodowane. Z góry dziękuje za pomoc.

Wyswietlenie poczatkowej zawartosci
ImieNazwiskoNr albumuOcenaData
Jan Jaworek 14332 3.5 2012-02-29
Bartlomiej Bukowy 14344 4.5 2012-01-30
Karol ╠╠╠╠╠╠╠╠2-02-29
Bartlomiej Bukowy 14344 4.5 2012-01-30
Karol ╠╠╠╠╠╠╠╠8757709291.56538e-7612-01-30
Karol ╠╠╠╠╠╠╠╠
Krol 12433 3.0 2012-01-28
Ryszard Kowalski 14342 4.5 2012-01-30
Piotr Janus 14╠╠╠╠╠╠╠╠
Ryszard Kowalski 14342 4.5 2012-01-30
Piotr Janus 14╠╠╠╠╠╠╠╠8085914131.65612e-76
Piotr Janus 14╠╠╠╠╠╠╠╠

C/C++
int showFile( string fileName_ )
{
    int accountCounter = 0;
    Studenci tab;
    ifstream inFile;
   
    inFile.open( fileName_, ios_base::binary | ios_base::in );
   
    if( inFile.is_open() )
    {
        cout << "Imie"
        << "Nazwisko"
        << "Nr albumu"
        << "Ocena"
        << "Data" << '\n';
       
        while( inFile.read(( char * ) & tab, sizeof tab ) )
        {
            cout << tab.imie
            << tab.nazwisko
            << tab.nr_albumu
            << tab.ocena
            << tab.data << "\n";
            accountCounter++;
           
        }
       
        inFile.close();
        return accountCounter;
    }
P-156777
mateczek
» 2017-01-22 18:14:03
ile wynosi sizeof(tab)  ??
P-156784
carlosmay
» 2017-01-22 18:18:55
Pokaż strukture i sposób zapisu. Podejrzewam, że cstringi nie mają znaku zerowgo na końcu, więc do pliku trafiają całe tablice (włącznie ze śmieciami).
I tak by tam trafiły, ale przy odczycie operator nie wie dokąd czytać.
P-156785
xien
Temat założony przez niniejszego użytkownika
» 2017-01-22 18:34:28
Tak to wyglądało w całości, obecnie trochę poprzerabiałem i niektóre rzeczy porobiłem na stringach i nie wiem czy warto będzie wracać do tamtego ale pozostał problem że nie wiem jak zrobić np. prowadzacy który jest w strukturze czy da się to jakoś na string czy na char żeby to wpisać do tablicy jako jeden element(więc jak coś to na to też proszę o jakąś odpowiedź, jak coś jeszcze nie jasne to napiszę) A poniżej jeszcze ten wcześniejszy kod w sprawie którego zakładałem temat
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;


struct Studenci
{
    //char nazwa_przedmiotu[40];
    char prowadzacy[ 30 ];
    char imie[ 25 ];
    char nazwisko[ 25 ];
    int nr_albumu;
    double ocena;
    char data[ 10 ];
};


int showFile( string fileName_ );
//========================================================================
int main()
{
    string fileName_ = "1.txt";
    Studenci tab;
   
    unsigned int accountNum = 0;
   
    cout << "Wyswietlenie poczatkowej zawartosci\n";
   
    if( !( accountNum = showFile( fileName_ ) ) )
         return 0;
   
   
   
    //tablica arr alokowana dynamicznie
    Studenci * arr = new Studenci[ accountNum ];
   
    //wczytanie danych pobranych z pliku do tablicy dynamicznej
    ifstream inFile;
    inFile.open( fileName_, ios_base::binary | ios_base::in );
    if( inFile.is_open() )
    {
        for( int i = 0; i < accountNum; i++ )
        {
            inFile.read(( char * ) & tab, sizeof( tab ) );
            arr[ i ] = tab;
        }
        inFile.close();
    }
    else
         return 0;
   
   
   
    showFile( fileName_ );
   
    //zwolnienie pamięci zajmowanej prze tablicę dynamiczną
    delete[] arr;
   
    return 0;
}

//========================================================================
//wyswietlenie zawartosci pliku
//========================================================================
int showFile( string fileName_ )
{
    int accountCounter = 0;
    Studenci tab;
    ifstream inFile;
   
    inFile.open( fileName_, ios_base::binary | ios_base::in );
   
    if( inFile.is_open() )
    {
        cout << setw( 5 ) << "Imie"
        << setw( 25 ) << "Nazwisko"
        << setw( 17 ) << "Nr albumu"
        << setw( 17 ) << "Ocena"
        << setw( 18 ) << "Data" << '\n';
       
        while( inFile.read(( char * ) & tab, sizeof tab ) )
        {
            cout << setw( 5 ) << tab.imie
            << setw( 25 ) << tab.nazwisko
            << setw( 17 ) << tab.nr_albumu
            << setw( 17 ) << tab.ocena
            << setw( 18 ) << tab.data << "\n";
            accountCounter++;
           
        }
       
        inFile.close();
        return accountCounter;
    }
    return 0;
}
P-156787
carlosmay
» 2017-01-22 20:18:37
To oznacza, że cstringi nie mają znaku zerowego i tak jest to zapisane do pliku.
Problem leży przy wprowadzaniu, wypełnianiu struktur przed zapisem do pliku.

edit:
C/C++
#include <iostream>
#include <fstream>

struct Studenci
{
    //char nazwa_przedmiotu[40];
    char prowadzacy[ 30 ];
    char imie[ 25 ];
    char nazwisko[ 25 ];
    int nr_albumu;
    double ocena;
    char data[ 10 ];
};

void fill_student( Studenci & student ) // to można napisać jako przeciążony operator>>
{
    std::cin >> student.prowadzacy;
    std::cin >> student.imie;
    std::cin >> student.nazwisko;
    std::cin >> student.nr_albumu;
    std::cin >> student.ocena;
    std::cin >> student.data;
}

void print_student( const Studenci & student ) // to można napisać jako przeciążony operator<<
{
    std::cout << student.prowadzacy << '\n'
    << student.imie << '\n'
    << student.nazwisko << '\n'
    << student.nr_albumu << '\n'
    << student.ocena << '\n'
    << student.data << '\n';
}

int main()
{
    Studenci * studenci = new Studenci[ 2 ]; // zamiast gołych wskaźników std::vector
    fill_student( studenci[ 0 ] );
    fill_student( studenci[ 1 ] );
   
    std::ofstream fout( "test.bin", std::ios::binary );
    if( fout ) {
        for( std::size_t i = 0; i < 2u; ++i ) {
            fout.write(( char * ) & studenci[ i ], sizeof( Studenci ) );
        }
    }
    fout.close();
   
    Studenci * odczytani_studenci = new Studenci[ 2 ];
    std::ifstream fin( "test.bin", std::ios::binary );
    if( fin ) {
        for( std::size_t i = 0; i < 2u; i++ )
             fin.read(( char * ) & odczytani_studenci[ i ], sizeof( Studenci ) );
       
    }
   
    for( std::size_t i = 0; i < 2u; ++i ) {
        print_student( odczytani_studenci[ i ] );
        std::cout << '\n';
    }
   
    delete[] odczytani_studenci;
    delete[] studenci;
}
P-156796
« 1 »
  Strona 1 z 1