我应该编写一个程序,使用 open()
命令创建新文件,我读到的所有内容都说,如果文件不存在,它应该这样做。
我的代码是这样的:
char startroom[] = "laruee.rooms/startroom.txt";
//...
int file_descriptor;
//...
file_descriptor = open(startroom, O_WRONLY | O_CREAT );
{
fprintf(stderr, "Could not open %s\n", startroom);
perror("in main");
exit(1);
}
然而,尽管我在谷歌上搜索了关于此命令的所有内容,表明如果文件不存在则应该创建该文件,但该文件并未创建。 (而且从我用谷歌搜索的所有内容来看,似乎我是宇宙中唯一遇到这个问题的程序员。)
什么给了?
最佳答案
您的问题可能是 operating-system (甚至 file-system )具体。我猜你正在运行 Linux在一些常用的文件系统上,如 Ext4或 BTRFS .
阅读open(2) & path_resolution(7) . 打开
可能失败的原因有多种(我们无法猜测哪个与您的计算机相关)。
您的代码可能未在您希望的条件下运行(工作目录、用户 ID...)
然后,改进您的代码:
char startroom[] = "laruee.rooms/startroom.txt";
//...
int file_descriptor = open(startroom, O_WRONLY | O_CREAT );
if (file_descriptor < 0) {
fprintf(stderr, "Could not open %s : %s\n",
startroom, strerror(errno));
char wdbuf[256];
if (getcwd(wdbuf, sizeof(wdbuf))
fprintf(stderr, "in %s\n", wdbuf);
exit(EXIT_FAILURE);
}
当在 errno
上使用 perror
或 strerror
时,您不需要任何可能将 errno
更改为的函数在失败的系统调用之后被调用。在 Linux 上使用 glibc fprintf(3)函数知道 %m
....
顺便说一句,你也可以strace(1)你的程序
或许还可以查看您的 /var/log/syslog
或 /var/log/messages
。确保您的磁盘未满(使用 df -h
和 df -i
)。如果你有 disk quotas ,一定不要溢出它们。确保您的程序在您希望的目录中运行,并且当前目录包含一个 laruee.rooms/
子目录;你可能会用 getcwd(2) 得到它就像我上面做的那样。
特别是对于类似服务器的程序,您可能需要使用 syslog(3) .
你应该阅读 Advanced Linux Programming
顺便说一句,您的 open
不是命令(即 xdg-open )而是 system call或至少一个 POSIX function
关于c - 我的 open() 命令没有创建新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28275915/