c++ Wyświetlanie danych i dziwne znaczki
Ostatnio zmodyfikowano 2017-01-22 20:18
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╠╠╠╠╠╠╠╠ 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; }
|
|
mateczek |
» 2017-01-22 18:14:03 ile wynosi sizeof(tab) ?? |
|
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ć. |
|
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 #include <iostream> #include <fstream> #include <string> #include <iomanip>
using namespace std;
struct Studenci { 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; Studenci * arr = new Studenci[ accountNum ]; 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_ ); delete[] arr; return 0; }
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; }
|
|
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: #include <iostream> #include <fstream>
struct Studenci { char prowadzacy[ 30 ]; char imie[ 25 ]; char nazwisko[ 25 ]; int nr_albumu; double ocena; char data[ 10 ]; };
void fill_student( Studenci & student ) { 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 ) { 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 ]; 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; } |
|
« 1 » |