Connecting Tech Pros Worldwide Forums | Help | Site Map

fwrite() fails when called after fread()

Richard Hsu
Guest
 
Posts: n/a
#1: Apr 11 '06
// code
#include "stdio.h"
int status(FILE * f) {
printf("ftell:%d, feof:%s\n", ftell(f), feof(f) != 0 ? "true" :
"false");
}

int case1() {
FILE * f = fopen("c:\\blah", "wb+");
int i = 5;

printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f));

rewind(f);

fread(&i,sizeof(int),1,f);
status(f);
printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f)); // fails

fread(&i,sizeof(int),1,f); // push it to eof
status(f);
printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f)); // now successful

fclose(f);
}

int case2() {
FILE * f = fopen("c:\\blah", "wb+");
int i = 5;

printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f));

rewind(f);

fseek(f,sizeof(int),0); // similar to fread but don't read just move
file pointer
status(f);
printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f)); // this works

fclose(f);
}

int main() {
printf("running case1..\n");
case1();
printf("running case2..\n");
case2();

system("PAUSE");
}

//----------------------------------------------------------------------------------------
Hi All,

in case1,
when i do fread() and then fwrite, fwrite fails to write, it works only
when i do another fread() to push the file pointer to eof. can someone
help me understand this ?

in case2,
instead of using fread() if i use fseek() to advance the file pointer
ahead, fwrite() works without any problem.

i am using ftell() to tell me where the file pointer is at. in both
cases, the file pointer is at the same position however in case1 fwrite
fails while it works in case2,

so my question is
a) why fwrite fails ?
b) why it works when i use another redundant fread() to push it to eof
?
c) why it works in case2 with fseek even though ftell() shows the same
position ?

thank you in advance.

Richard Hsu
Toronto, Canada.


Walter Roberson
Guest
 
Posts: n/a
#2: Apr 11 '06

re: fwrite() fails when called after fread()


In article <1144773891.446260.122070@u72g2000cwu.googlegroups .com>,
Richard Hsu <richard.hsu@gmail.com> wrote:
[color=blue]
>int case1() {[/color]
[color=blue]
> fread(&i,sizeof(int),1,f);
> status(f);
> printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f)); // fails[/color]

from the description of fopen()'s update mode ('+')

However, output may not be directly followed by input without
an intervening call to teh fflush function or to a file positioning
function (fseek, fsetpos, or rewind), and input may not be
directly followed by output without an intervening call to a
file positioning function, unless the input operation encounters
end-of-file.
--
I was very young in those days, but I was also rather dim.
-- Christopher Priest
Richard Hsu
Guest
 
Posts: n/a
#3: Apr 11 '06

re: fwrite() fails when called after fread()


thank you very much.

Walter Roberson wrote:[color=blue]
> In article <1144773891.446260.122070@u72g2000cwu.googlegroups .com>,
> Richard Hsu <richard.hsu@gmail.com> wrote:
>[color=green]
> >int case1() {[/color]
>[color=green]
> > fread(&i,sizeof(int),1,f);
> > status(f);
> > printf("fwrite:%d\n", fwrite(&i,sizeof(int),1,f)); // fails[/color]
>
> from the description of fopen()'s update mode ('+')
>
> However, output may not be directly followed by input without
> an intervening call to teh fflush function or to a file positioning
> function (fseek, fsetpos, or rewind), and input may not be
> directly followed by output without an intervening call to a
> file positioning function, unless the input operation encounters
> end-of-file.
> --
> I was very young in those days, but I was also rather dim.
> -- Christopher Priest[/color]

Closed Thread