【发布时间】:2026-01-09 01:00:01
【问题描述】:
我想要:
- 如果文件不存在则创建,
not overwritten if it does。- 在任何我想要的地方读写和
fseek
我找不到有效的模式——“w+”、“rw”、“rwb+”、“r+b”、“w+b”、“a+”还是什么?
表现良好的基础级别'open'是:
int fd =open("fname", O_RDWR | O_CREAT, 0666);
但我想知道fopen alternative。
我尝试的每个模式字母 [w, r, a, +] 组合要么覆盖内容,要么 fseek-fwrite 不写在它应该写的地方。无论fseek 设置什么,“a+”都将始终追加...“rw+”可以正常工作,但不会创建不存在的文件...等。
更新:澄清为什么例如“a+”不是解决方案:
#include <stdio.h>
int main()
{ FILE *fp =fopen("aaa.txt", "a+");
fwrite("aaaaaaaaaaaaaaaaaaa", 1, 10, fp);
fseek(fp, 5, SEEK_SET);
fwrite("AAA", 1, 3, fp);
fclose(fp);
return 0;
}
runned with: $ rm aaa.txt; gcc test.c && ./a.out && cat aaa.txt && echo .
produces wrong result: aaaaaaaaaaAAA.
result should be: aaaaaAAAaa
Update2:总结...我最终得到的最小功能:
FILE *fopenrwc(char*n) {FILE*f=fopen(n,"a");if(f)fclose(f),f=fopen(n,"r+");return f;}
or:
FILE *fopenrwc(char*n) {return fdopen(open(n,O_RDWR|O_CREAT,0666),"r+");}
【问题讨论】:
-
为什么
a+不适合你? -
请说明为什么“a+”不起作用。
-
@SouravGhosh "a+" 是我的第一选择,但在包含内容的文件中,fseek(0), write(buf)... 附加到文件末尾而不是开头。它没有附加 fseek 和 ftell 所说的内容。
-
如果您在一台足够类似于 POSIX 的机器上能够使用
open(),请不要低估fdopen()的好处,它允许您使用带有选项的open()您展示了然后创建一个文件流来使用该文件。 -
如果您想要更精细的控件,例如
O_EXCL,或专门的属性,例如O_DSYNC或O_NOCTTY,甚至可以控制创建文件的权限,而不是默认的修改权限通过umask(),然后open()加上fdopen()实际上是唯一的方法。