user3078259
user3078259

Reputation: 85

struggling with fputc in c

In the file "file1.dat" I wrote "anahasapples".
And then I wrote this program:

    #include <stdio.h>
    #include <conio.h>

    int main()
    {
        FILE *ptr_file;
        ptr_file=fopen("file1.dat","r+");
        printf("%c",fgetc(ptr_file));
        printf("%c",fgetc(ptr_file));
        printf("%c\n",fgetc(ptr_file));
        char c;
        printf("char:\n");
        c=getch();
        fputc(c,ptr_file);

        return 0;
    }

The part where I print the first 3 characters from the file works. After that, I want to put a char into the file.
When I compile this, I don't get any errors, but the containing text doesn't change.

Upvotes: 2

Views: 2445

Answers (2)

AJ.
AJ.

Reputation: 4534

set the pointer first

 fseek(ptr_file, ftell (ptr_file), SEEK_SET);
        fputc(c,ptr_file);

See this link for explanation http://cplus.about.com/od/learningc/ss/files_8.htm

http://www.rainydayz.org/beej/bgc/fseek.html

Upvotes: 1

Moshe Rubin
Moshe Rubin

Reputation: 1982

Documentation for fopen() standardly shows the following explanation:

When a file is opened with update mode (+ as the second or third character in the mode argument), both input and output may be performed on the associated stream. However, output must not be directly followed by input without an intervening call to fflush(3C) or to a file positioning function (fseek(3C), fsetpos(3C) or rewind(3C)), and input must not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.

Just add an fseek() to your code and all works well:

#include <stdio.h>
#include <conio.h>

int main()
{
    FILE *ptr_file;
    ptr_file=fopen("file1.dat","r+");
    printf("%c",fgetc(ptr_file));
    printf("%c",fgetc(ptr_file));
    printf("%c\n",fgetc(ptr_file));
    char c;
    printf("char:\n");
    c=getch();
    fseek( ptr_file, 0, SEEK_CUR );   /* Add this line */
    int err = fputc(c,ptr_file);
    printf ("err=%d\n", err);

    return 0;
}

Here's my file1.dat before and after inputting an 'x':

Before

anahasapples

After

anaxasapples

It seems that by default the fputc() tries to write past the end of the file, so you need to reposition the file pointer (e.g., using fseek) to make the write occur at the point of the current file pointer.

Upvotes: 5

Related Questions