fwrite() problem with DECStation Ultrix 4.0
From the screen of Deneva...
heller at cs.umass.edu
Mon Nov 12 10:41:44 AEST 1990
To: mjr at decuac.DEC.COM
(I tried to send this direct, but it kept coming back - it seems that
"decuac.DEC.COM" is down. I don't know were else to send it to. I'm
hoping that mjr is reading comp.unix.ultrix on some machine somewhere.)
>> Uhm, are the data blocks being written some kind of C-type data
>>structures ? If you write code like:
>>
>>struct ff {
>> int x2;
>> char tag;
>>} xx;
>>
>>write(fd,&xx,sizeof(xx));
No, this is not what I am doing. Most of the fwrite()'s are actually writing
one byte at a time. I know about byte order and variations in sizeof(int) - the
code is explicitly written to normalize this. The only time I'm calling
fwrite() with a size greater than one is when I'm writing arrays of either
characters (ASCII strings) or arrays of unsigned bytes (generally arrays of bits
that have been built with the "correct" bit and byte order). For everything
else I am using these functions:
write_byte8(file,value)
FILE *file;
unsigned char value;
{
if (fwrite(&value,1,1,file) < 1) return(0);
else return(1);
}
write_byte16(file,value)
FILE *file;
short int value;
{
if (!write_byte8(file,(value & 0x00ff))) return(0);
if (!write_byte8(file,((value >> 8) & 0x00ff))) return(0);
return(1);
}
write_byte32(file,value)
FILE *file;
long int value;
{
if (!write_byte8(file,(value & 0x00ff))) return(0);
if (!write_byte8(file,((value >> 8) & 0x00ff))) return(0);
if (!write_byte8(file,((value >> 16) & 0x00ff))) return(0);
if (!write_byte8(file,((value >> 24) & 0x00ff))) return(0);
return(1);
}
write_float32(file,value)
FILE *file;
float value;
{
union {
long int l;
float f;
} fl_union;
fl_union.f = value;
return(write_byte32(file,fl_union.l));
}
I know that this is not real effiencient, but this is portable and byte order
independent (the only non-portable function is write_float32() - this would only
be a problem if I were to run this on a VAX - all of the other machines involved
(TI Explorer LISP machines, Suns, and DECStations) use the same sort of FP rep.
- IEEE - we won't be running this code on a VAX, since the KBV package is not
available (and probably won't ever be available) on VAXes). All of the higher
level structures beyond ASCII strings and arrays of bytes, are written out
piecemeal using the above functions.
What is real strange is the fact the files are different on different
file-systems, even when the program is run on the SAME machine, without
re-compiling or re-linking. That is, fwrite() is behaving differently depending
on where it is writing to, not where it is writing from. The implication is
that the problem is in the file-system, kernel, or device driver. If this is
the case, then we could come in one morning and find ourselves with a bunch of
trashed file-systems. A very scary thought...
Robert Heller
ARPANet: Heller at CS.UMass.EDU
BITNET: Heller at UMass.BITNET
BIX: locks.hill.bbs
GEnie: RHeller
FidoNet: 1:321/153 (Locks Hill BBS, Wendell, MA)
CompuServe 71450,3432
Local PV VAXen: COINS::HELLER
UCC Cyber/DG: Heller at CS
More information about the Comp.unix.ultrix
mailing list