Yuri
Yuri

Reputation: 1219

How to rewrite full content of a file in C

I have text file which uses for ajax source. Every 1 sec browser sends ajax request to read actual data from this file. Also I have deamon written on C which writes actual data to that file. Look at the following code:

static void writeToFile_withLock(const char * file_path, const char * str)
{
    struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
    int fd;
    const char * begin = str;
    const char * const end = begin + strlen(str);

    fl.l_pid = getpid();

    if ((fd = open(file_path, O_CREAT | O_WRONLY)) == -1) {
        perror("open");
        exit(1);
    }
    printf("Trying to get lock...\n");
    if (fcntl(fd, F_SETLKW, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }
    printf("got lock\n");

    printf("Try to write %s\n", str); 
    while (begin < end)
    {
        size_t remaining = end - begin;
        ssize_t res = write(fd, begin, remaining);
        if (res >= 0)
        {
            begin += res;
            continue; // Let's send the remaining part of this message
        }
        if (EINTR == errno)
        {
            continue; // It's just a signal, try again
        }
        // It's a real error
        perror("Write to file");
        break;
    }

    fl.l_type = F_UNLCK;  /* set to unlock same region */

    if (fcntl(fd, F_SETLK, &fl) == -1) {
        perror("fcntl");
        exit(1);
    }

    printf("Unlocked.\n");

    close(fd);

}

The problem: If former data was > the new data then old several symbols keeped at the end of the file.

How I can rewrite full file content?

Thanks in advance.

Upvotes: 2

Views: 1854

Answers (2)

William Pursell
William Pursell

Reputation: 212198

You basically have two options. Either set the O_TRUNC bit of the 2nd parameter of open to discard all content when you open the file, or call ftruncate when you are finished to discard the content of the file that you do not want. (Or use truncate, but since you already have an open file descriptor, there's no advantage to doing that.)

Upvotes: 0

K Scott Piel
K Scott Piel

Reputation: 4380

Add O_TRUNC to the open() call...

O_TRUNC

If the file already exists and is a regular file and the open mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise the effect of O_TRUNC is unspecified.

Upvotes: 3

Related Questions