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);