How to elegantly open or create new file for reading and writing but not discard existing contents?

5 views (last 30 days)
If the file exists, open it for reading and writing, but don't discard existing content; else, create it.
Isn't it a very common use case? Why does fopen not seemingly support this?
Note that I don't want to append. I want to read and overwrite some part of the existing content while keep other parts.

Accepted Answer

Walter Roberson
Walter Roberson on 4 Aug 2021
fopen with 'a' and close immediately. Then fopen 'r+'
This does rely on no process deleting the file between the time it is fopen 'a' and it is fopen again.
  4 Comments
Walter Roberson
Walter Roberson on 6 Aug 2021

The underlying languages of implementation, C and C++, do not support the mode you are requesting.

The calls that do support that mode, open(), is not part of C, and is instead a POSIX call https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html . That is a problem on Windows systems as Windows no longer supports POSIX.

I have not examined to find out if Windows supports the mode. MacOS and Linux potentially could, but Mathworks would have to specifically rewrite the code to use non-portable functions because it is not an available mode using portable functions.

Sign in to comment.

More Answers (1)

KSSV
KSSV on 4 Aug 2021
Read the documentation of fopen, there are multiple options present.
look for fopen with 'a+'. Also have a look on the function exist.
  4 Comments
埃博拉酱
埃博拉酱 on 4 Aug 2021
I have read the documentation and found no options that exactly match. That's why I ask here. What I'm expecting is clearly written in the question: If the file exists, open it for reading and writing, but don't discard existing content or append; else, create it.
Walter Roberson
Walter Roberson on 4 Aug 2021
Edited: Walter Roberson on 6 Aug 2021

MATLAB does not provide that combination of open permissions.

C's fopen() does not support that combination https://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html and it has to instead be done through a C open() call followed by a call to upgrade the resulting file descriptor into a file*

Sign in to comment.

Products


Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!