Sum*_*Tea 3 c linux file-io fopen
我有一个关于文件打开模式的问题fopen().
在我的情况下,我想自由地寻找光标,EOF有时可能甚至超越.更重要的是,我还想附加到它而不是截断现有文件.我试图以a+模式打开文件; 但是,我不能自由地寻找文件光标.每当我寻找光标时EOF,新到的数据将附加到文件的末尾,而不是我指定的位置.而如果在w+模式下打开,则现有文件将被截断.这个问题有完美的解决方案吗?
更新:
没有明确说明的一点是该文件可能并不总是存在; 在这种情况下我必须创建一个新文件.
实际上,我想处理一个配置文件.我不知道这样做是否是好的做法.或者我应该首先放置一个空的配置文件.因此没有必要关心案例文件不存在?
以下是代码段:
FILE *f = fopen(FILE_PATH, "wb+");
struct record r;
if (f) {
if (fread((void *)&r, 1, sizeof(struct record), f) {
/* File exists, do the normal flow */
} else {
if (feof(f)) {
/* File is newly created, do some initialization */
}
}
} else {
/* issue a warning */
}
Run Code Online (Sandbox Code Playgroud)
您将不得不分两个阶段处理可能不存在的文件,首先假设它存在,然后处理它的缺席:
if ((f = fopen(filename, "rb+") == 0)
f = fopen(filename, "wb+");
if (f == 0)
...report error...
Run Code Online (Sandbox Code Playgroud)
该"rb+"模式将无法打开不存在的文件(但其他行为符合您的要求).如果该文件不存在,那么"wb+"将执行您想要的操作(尽管它仍然可能失败,例如,如果该文件存在但您没有写入它的权限).你必须希望你没有受到双重尝试的TOCTOU(检查时间,使用时间)攻击.
另一种方法是使用open()具有适当标志的系统调用的3参数版本来打开文件描述符,然后使用fdopen()从文件描述符创建文件流:
#include <fcntl.h>
int fd;
if ((fd = open(filename, O_RDRW | O_CREAT, 0644)) >= 0)
f = fdopen(fd, "rb+");
Run Code Online (Sandbox Code Playgroud)
你可以通过open()标志进行相当精确的控制.