streams - c standard

M

MisterE

Is there anything in c standard about the operation of file streams etc. in
reguards to how they are supposed to act if an over flow occurs. I am trying
to work out the correct way to handle files that are greater than 2^32
bytes. Different compilers/operating systems etc. all behave different for
ftell. I guess the answer is its undefined...
 
R

Richard Bos

MisterE said:
Is there anything in c standard about the operation of file streams etc. in
reguards to how they are supposed to act if an over flow occurs.

No. Except, of course, that merely writing to a file which is about to
"overflow" (quotes because it's not the same thing as a real numeric
overflow) may continue to write properly; may write garbage (since no
conforming program can detect the difference anyway); may return with an
error status as it would for, say, a file without write access; but may
_not_ crash the program, return nonsense, or exhibit other truly
undefined behaviour.

Richard
 
S

santosh

MisterE said:
Is there anything in c standard about the operation of file streams
etc. in reguards to how they are supposed to act if an over flow
occurs.

Overflow for a file?

All that Standard C guarantees is that the various I/O functions of the
Standard library, (like putc, printf etc.), will return a status value
indicating success or failure. The variable `errno` may or may not be
set to any meaningful value.

Thus though you can detect a failed operation, it's generally difficult
or not possible with Standard C to find out _why_ the operation has
failed. You might have to depend upon implementation and system
specific methods.
I am trying to work out the correct way to handle files that
are greater than 2^32 bytes.

On 32 bit systems, you very probably have to use non-Standard
alternatives like ftello, ftello64 etc.

You shouldn't have a problem on 64 bit systems.
Different compilers/operating systems
etc. all behave different for ftell.

No. ftell behaves the way the Standard defines it. However it may or may
not be sufficient under certain conditions.
I guess the answer is its
undefined...

It _is_ defined. You're going beyond it's specification however, so what
do you expect?
 
J

Justin Spahr-Summers

On 32 bit systems, you very probably have to use non-Standard
alternatives like ftello, ftello64 etc.

You shouldn't have a problem on 64 bit systems.

Isn't this at least part of the reason fgetpos() and fsetpos() exist?
fpos_t is allowed to be larger than a long, and even a non-integral
type, to handle possibly huge files.
 
S

santosh

Justin said:
Isn't this at least part of the reason fgetpos() and fsetpos() exist?
fpos_t is allowed to be larger than a long, and even a non-integral
type, to handle possibly huge files.

Yes. I should have mentioned that. When the OP said he was using ftell,
(and encountering problems), I automatically thought of ftell-like
alternatives.

As you said, fgetpos and fsetpos are Standardised and better.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top