Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C open()函数失败。我的参数错了吗?_C_File_Posix - Fatal编程技术网

C open()函数失败。我的参数错了吗?

C open()函数失败。我的参数错了吗?,c,file,posix,C,File,Posix,此函数无法打开文件。我的参数是否有误,或者是什么原因导致了这个问题 int CreateFile(const char *filename){ char filepath[strlen(filename) + 3]; sprintf(filepath, "./%s", filename); int fd = open(filepath, O_CREAT, O_APPEND, S_IWGRP); if(fd == -1) pr

此函数无法打开文件。我的参数是否有误,或者是什么原因导致了这个问题

    int CreateFile(const char *filename){
        char filepath[strlen(filename) + 3];
        sprintf(filepath, "./%s", filename);
        int fd = open(filepath, O_CREAT, O_APPEND, S_IWGRP);
        if(fd == -1) printf("file read failed\n");
        return fd;
    }
Xcode只向控制台打印“文件读取失败”。我也试着通过终端运行这个,但也没用

我修复了NetMage指出的一个问题:

int CreateFile(const char *filename){
    char filepath[strlen(filename) + 3];
    sprintf(filepath, "./%s", filename);
    int fd = open(filepath, O_CREAT|O_APPEND, S_IWGRP);
    if(fd == -1) printf("file read failed\n");
    return fd;
}

不幸的是,这并没有解决问题

对于标签,
打开
函数只接受一个参数,必须将其位或组合在一起:

#include <errno.h>
#include <string.h>

int fd = open(filepath, O_CREAT|O_APPEND, S_IWGRP);
if (fd == -1) printf("file read failed: %s\n", strerror(errno));
#包括
#包括
int fd=open(文件路径,O|u创建| O|u附加,S|u IWGRP);
如果(fd==-1)printf(“文件读取失败:%s\n”,strerror(errno));

步骤1-通过将
文件路径打印到终端或在调试器中检查,验证是否正确设置了
文件路径

第2步-验证该文件是否存在于该路径中,以及是否设置了其权限,以便您可以打开它。如果
filepath
“/foo”
,则名为
foo
的文件最好存在于当前工作目录(运行程序的目录)中,并且至少需要具有读取权限

步骤3-如果文件不存在,请验证您是否具有在当前工作目录中创建新文件的权限

第4步-如果在完成所有这些操作后仍然出现错误,请检查。除了“它不起作用”之外,它还会给你一些额外的信息

#包括
...
如果(fd==-1)
{
开关(错误号)
{
案例EACCESS://权限问题
处理权限问题();
打破
case EEXIST://文件已经存在,您使用了O_CREAT和O_EXCL
句柄已存在问题();
打破
case EFAULT://错误路径
处理错误路径问题()
打破
...
}
printf(“文件读取失败\n”);
}
NetMage指出了一个问题——您的标志需要按位或组合在一起,而不是作为单独的参数列出。很惊讶编译器没有因为这个对你大喊大叫

Per(稍微重新格式化,并注意粗体文本):

简介

#include <sys/stat.h> #include <fcntl.h>

int open(const char *path, int oflag, ...);

请注意,可能仍会发生其他故障。如注释中所述,您在文件名前加了
“/”
,例如,如果您通过了
“/tmp/filename”
,并且
tmp
目录在当前工作目录中不存在,这可能会导致问题,因为
open()
不会在任何路径中创建丢失的目录。

请澄清,您知道它无法打开,因为它正在打印
“文件读取失败\n”
,对吗?是的,只是在中编辑了它。您没有打开文件进行读取,因此错误消息有点误导性……是的,我没有过多考虑就把那一行放在那里,只是为了看看它是否被打印。。抱歉
perror(filepath)
(如果在
open
失败后立即调用,因此没有其他函数有机会更改
errno
)将告诉您调用失败的原因。然后我建议打印/显示
errno
,以便您知道发生的错误,这很可能是因为您没有权限写入当前目录。对不起,我对所有这些稍高级的东西都不熟悉,那么如何完成呢?我添加了一些代码,以在
fd
-1
时输出
errno
。如果不存在文件,O_create标志不应该创建新文件吗?如何检查创建新文件的权限?可以在程序中设置权限吗?@FrostyWhite:如果您在当前目录中有权限,则应该设置权限。既然您提到了XCode,我假设您在Mac上,那么打开一个终端窗口,导航到运行程序的目录,然后键入
ls-lad$(pwd)
。最左边的一列将显示该目录的权限;它应该看起来像
drwxr-xr-x
。这表明目录的所有者拥有读取、写入和执行权限,而其他人只有读取和执行权限。@FrostyWhite:但是,在开始之前,请在尝试打开后检查
errno
的值-这可能是其他问题。
#include <sys/stat.h> #include <fcntl.h>

int open(const char *path, int oflag, ...);
int fd = open(filepath, O_WRONLY|O_CREAT|O_APPEND, S_IWGRP);