Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

clear/truncate file in C when already open in "r+" mode

My code currently looks something like this (these steps splitted into multiple functions):

/* open file */
FILE *file = fopen(filename, "r+");

if(!file) {

  /* read the file */

  /* modify the data */

  /* truncate file (how does this work?)*/

  /* write new data into file */

  /* close file */
  fclose(file);
}

I know I could open the file with in "w" mode, but I don't want to do this in this case. I know there is a function ftruncate in unistd.h/sys/types.h, but I don't want to use these functions my code should be highly portable (on windows too).

Is there a possibility to clear a file without closing/reopen it?

like image 835
MarcDefiant Avatar asked Oct 19 '12 19:10

MarcDefiant


People also ask

How do I truncate a file in C?

With standard C, the only way is to reopen the file in "w+" mode every time you need to truncate. You can use freopen () for this. "w+" will continue to allow reading from it, so there's no need to close and reopen yet again in "r+" mode. The semantics of "w+" are:

How to clear a file with the truncate() method?

How to Clear a File with the truncate() Method The truncate() method reduces a document’s size. This method takes an optional argument that sets the new size of the file. If no argument is supplied, the file is left unchanged. An attempt to truncate a file to longer than its original size may have unexpected results.

How to pad or truncate a file in Linux?

# Open a file for writing, and truncate it to 1234 bytes. # Truncate a file to 567 bytes. It will pad or truncate as needed. On the 64-bit version, we can call the native runtime library: Otherwise (on all versions), we call the external truncate command: /* 2. the size of file after truncation.

What is truncate in Linux?

As clear from the name “truncate”, it means removing, clearing up, or reducing size. There are many ways available to truncate a file while you are working on the Linux operating system.


2 Answers

With standard C, the only way is to reopen the file in "w+" mode every time you need to truncate. You can use freopen() for this. "w+" will continue to allow reading from it, so there's no need to close and reopen yet again in "r+" mode. The semantics of "w+" are:

Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file.

(Taken from the fopen(3) man page.)

You can pass a NULL pointer as the filename parameter when using freopen():

my_file = freopen(NULL, "w+", my_file);

If you don't need to read from the file anymore at all, when "w" mode will also do just fine.

like image 162
Nikos C. Avatar answered Sep 20 '22 07:09

Nikos C.


You can write a function something like this:(pseudo code)

if(this is linux box) 
use truncate()
else if (this is windows box)
use _chsize_s()

This is the most straightforward solution for your requirement.

Refer: man truncate and _chsize_s at msdn.microsoft.com

and include necessary header files too.

like image 27
askmish Avatar answered Sep 20 '22 07:09

askmish