'fwrite' does not write 'char' variables in binary files
8 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
blenis22
le 18 Mar 2019
Modifié(e) : blenis22
le 24 Mar 2019
I am reading a binary phase space file (* .egsphsp #), for simulations monteCarlo with EGSnrc.
My problem is in the file header. The floating variables read them in 1 byte with fread, however, the characters are read in 2 bytes, which causes problems when I generate my own phase space file, since fwrite writes the characters in 1 byte and as double.
Part of my codes:
READ
fprintf ('Reading phase space file ... \ n')
MODE_RW = setstr (fread (fid, 5, 'uchar')) '; % Mode
NPPHSP = fread (fid, 1, 'int32'); %
NPHOTPHSP = fread (fid, 1, 'int32'); %
EKMAXPHSP = fread (fid, 1, 'float32'); %
EKMINPHSP = fread (fid, 1, 'float32'); %
NINCPPHSP = fread (fid, 1, 'float32'); %
Header_File = struct ('Mode', MODE_RW, 'total_particles', ... NPPHSP,' total_photons', NPHOTPHSP, Max_energy ', ... EKMAXPHSP,' Min_energy ', EKMINPHSP, ...' particles_source ', NINCPPHSP);
WRITE
MODE_RW = Header_File.Mode;
NPPHSP = Header_File.total_particles;
NPHOTPHSP = Header_File.total_photons;
EKMAXPHSP = Header_File.Max_energy;
EKMINPHSP = Header_File.Min_energy;
NINCPPHSP = Header_File.particles_source;
fid_w = fopen ('prueba.egsphsp1', 'wb');
g = 1;
if g == 0% zlast
a = fwrite (fid_w ,MODE_RW, 'uchar');
b = fwrite (fid_w, NPPHSP, 'int32');
c = fwrite (fid_w, NPHOTPHSP, 'int32');
d = fwrite (fid_w, EKMAXPHSP, 'float32');
e = fwrite (fid_w, EKMINPHSP, 'float32');
f = fwrite (fid_w, NINCPPHSP, 'float32');
.
.
.
'a' and 'MODE_RW' are not of the same class and have different bytes.
I need to read five characters in 5 bytes (1 byte / char). How do I do it?
0 commentaires
Réponse acceptée
Titus Edelhofer
le 18 Mar 2019
Hi,
I'm not really sure if this is not working as it should. If you do the following:
fid = fopen('foo.bin', 'wb');
fwrite(fid, 'hello', 'uchar');
fclose(fid)
you will have a file created with 5 bytes. The return argument of fwrite may be double, but it only tells you that you wrote 5 bytes, not the content.
Now for the reading: if you want to have 5 bytes (and not 5 characters with 2 bytes each) do the following:
fid = fopen('foo.bin', 'rb');
s = fread(fid, '*uchar')';
str = char(s) % you indeed read the hello from above
whos s % will have uint8, i.e., the ascii code
fclose(fid);
Titus
1 commentaire
Plus de réponses (1)
Voir également
Catégories
En savoir plus sur Whos dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!