Ĺadny brzuch
Witam
mam taką strukture
struct Baza { char tag[3]; char Title[30]; char Artist[30]; char Album[30]; char Year[4]; char Comment[30]; char Genre[1]; };
zczytuję ją z pliku
if(OpenDialog1->Execute()) { Baza nowa; fstream outfile; outfile.open(OpenDialog1->FileName.c_str(), ios::in | ios::binary); outfile.seekg(-128,ios::end); outfile.read((char *)&nowa, sizeof(nowa)); outfile.close();}
nom i przedebugowalem to i stwierdzam ze baza jest żle zczytywana.
Do niektórych elementow jest zczytywana większa ilość bajtów niż jest określone.
Jak zrobić aby ilość zczytywanych bajtów była taka jak została określona??
Użytkownik DarkCez edytował ten post 09 grudzień 2005, 21:25
mozesz podac przyklad (do ktorych pol i o ile bajtow wiecej) ?
Być może jest czytane za dużo bajtów, ponieważ kompilator je wyrównał, co ma na celu przyspieszenie działania programu. Ale można temu zapobiec poprzez "spakowanie" struktury. Można to zrobić tak:
struct test {
int a;
char b;
int c;
} __attribute__((__packed__));
__attribute__((__packed__));
to sie nie kompiluje (pisze że __packed__ jest nie zdefiniowane)
mozesz podac przyklad (do ktorych pol i o ile bajtow wiecej) ?
do pola tag i Genre (do ok 10 bajtow za duzo)
Nie zauważyłem, że używasz bcb. Spróbuj tak:
#pragma pack(push, 1) struct Baza { // (...) }; #pragma pack(pop)
nom jak wezme podgląd calej struktury to niby jest dobrze zczytana
ale jak odwołuje scię do posczególnych elementow tej struktury to wtedy jest problem
nowa.tag;
i tu powinny być trzy bajty a jest więcej
nom jak wezme podgląd calej struktury to niby jest dobrze zczytana
ale jak odwołuje scię do posczególnych elementow tej struktury to wtedy jest problem
nowa.tag;
i tu powinny być trzy bajty a jest więcej
teraz zauwazylem ze obojętnie jaką wartosc ustawie w tag[3] to zawsze zczyta mi 16 bajtow, nie rozumiem tego
A dodajesz \0 na końcu każdego stringa ?
A dodajesz \0 na końcu każdego stringa ?
ktorego stringa??
on zczytuje za dużo a nie za mało
ktorego stringa??
Wszystkich.
on zczytuje za dużo a nie za mało
No właśnie więc musisz ograniczyć to, żeby wczytywało się do \0.
Pokaże ci na przykładzie:
#include <iostream> using namespace std; struct test { char tag1[3]; char tag2[3]; }; int main() { test t; strcpy(t.tag1,"123"); strcpy(t.tag2,"456"); cout << t.tag1 << endl; // wypisze 123456 cout << t.tag2 << endl; // wypisze 456 cin.get(); }
Jak widzisz tag1 wypisuje, też zwartość drugiego stringa, więc musisz go ograniczyć znakiem \0.
Użytkownik Ku.ririn edytował ten post 10 grudzień 2005, 21:21
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
mam taką strukture
struct Baza { char tag[3]; char Title[30]; char Artist[30]; char Album[30]; char Year[4]; char Comment[30]; char Genre[1]; };
zczytuję ją z pliku
if(OpenDialog1->Execute()) { Baza nowa; fstream outfile; outfile.open(OpenDialog1->FileName.c_str(), ios::in | ios::binary); outfile.seekg(-128,ios::end); outfile.read((char *)&nowa, sizeof(nowa)); outfile.close();}
nom i przedebugowalem to i stwierdzam ze baza jest żle zczytywana.
Do niektórych elementow jest zczytywana większa ilość bajtów niż jest określone.
Jak zrobić aby ilość zczytywanych bajtów była taka jak została określona??
Użytkownik DarkCez edytował ten post 09 grudzień 2005, 21:25
mozesz podac przyklad (do ktorych pol i o ile bajtow wiecej) ?
Być może jest czytane za dużo bajtów, ponieważ kompilator je wyrównał, co ma na celu przyspieszenie działania programu. Ale można temu zapobiec poprzez "spakowanie" struktury. Można to zrobić tak:
struct test {
int a;
char b;
int c;
} __attribute__((__packed__));
__attribute__((__packed__));
to sie nie kompiluje (pisze że __packed__ jest nie zdefiniowane)
mozesz podac przyklad (do ktorych pol i o ile bajtow wiecej) ?
do pola tag i Genre (do ok 10 bajtow za duzo)
Nie zauważyłem, że używasz bcb. Spróbuj tak:
#pragma pack(push, 1) struct Baza { // (...) }; #pragma pack(pop)
nom jak wezme podgląd calej struktury to niby jest dobrze zczytana
ale jak odwołuje scię do posczególnych elementow tej struktury to wtedy jest problem
nowa.tag;
i tu powinny być trzy bajty a jest więcej
nom jak wezme podgląd calej struktury to niby jest dobrze zczytana
ale jak odwołuje scię do posczególnych elementow tej struktury to wtedy jest problem
nowa.tag;
i tu powinny być trzy bajty a jest więcej

teraz zauwazylem ze obojętnie jaką wartosc ustawie w tag[3] to zawsze zczyta mi 16 bajtow, nie rozumiem tego
A dodajesz \0 na końcu każdego stringa ?
A dodajesz \0 na końcu każdego stringa ?
ktorego stringa??
on zczytuje za dużo a nie za mało
ktorego stringa??
Wszystkich.
on zczytuje za dużo a nie za mało
No właśnie więc musisz ograniczyć to, żeby wczytywało się do \0.
Pokaże ci na przykładzie:
#include <iostream> using namespace std; struct test { char tag1[3]; char tag2[3]; }; int main() { test t; strcpy(t.tag1,"123"); strcpy(t.tag2,"456"); cout << t.tag1 << endl; // wypisze 123456 cout << t.tag2 << endl; // wypisze 456 cin.get(); }
Jak widzisz tag1 wypisuje, też zwartość drugiego stringa, więc musisz go ograniczyć znakiem \0.
Użytkownik Ku.ririn edytował ten post 10 grudzień 2005, 21:21