如何用fopen()选择开放模式?

我有一个关于使用fopen()的文件打开模式的问题.

在我的情况下,我想*地寻找光标,有时可能甚至超出EOF.更重要的是,我还想附加到它而不是截断现有文件.我试图以一种模式打开文件;但是,我不能*地寻找文件光标.每当我寻找超出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 */
}

解决方法:

您将不得不分两个阶段处理可能不存在的文件,首先假设它存在,然后处理它的缺席:

if ((f = fopen(filename, "rb+") == 0)
    f = fopen(filename, "wb+");
if (f == 0)
    ...report error...

“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+");

你可以用旗帜精确控制open().

上一篇:UIS89110的键盘测试


下一篇:c – fopen问题 – 打开的文件太多了