c - 我的 open() 命令没有创建新文件

标签 c file

我应该编写一个程序,使用 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在一些常用的文件系统上,如 Ext4BTRFS .

阅读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 上使用 perrorstrerror 时,您不需要任何可能将 errno 更改为的函数在失败的系统调用之后被调用。在 Linux 上使用 glibc fprintf(3)函数知道 %m ....

顺便说一句,你也可以strace(1)你的程序

或许还可以查看您的 /var/log/syslog/var/log/messages。确保您的磁盘未满(使用 df -hdf -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/

相关文章:

从 C 中的 union 复制数据

c - 字符指针数组打印垃圾

c - 当括号导致语法错误时,如何在宏参数内的大括号内使用逗号?

c - 逐字读取文件并输出空格

c - 如何在C中将一个文件的内容逐字复制到另一个文件?

python - 如何从python中的文件中删除除空格之外的特殊字符?

c - 维度大于 3 的数组地址

c - 退出函数时结构体会获取垃圾值

c - 我的 fscanf 输出一个很大的负数

c++ - 为什么我不能用文本文件创建文件映射?