此功能无法打开文件。我的参数是错误的还是可能导致此问题的原因?
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;
}
不幸的是,这没有解决问题
答案 0 :(得分:1)
open
函数只需要oflags
的一个参数,它必须一起进行位编码:
#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));
答案 1 :(得分:1)
步骤1 - 验证是否正确设置了filepath
,方法是将其打印到终端或在调试器中进行检查。
步骤2 - 验证该路径中的文件是否存在 ,并且已设置其权限以便您可以将其打开。如果filepath
为"./foo"
,则当前工作目录(运行程序的目录)中最好存在名为foo
的文件,并且需要至少具有读取权限。
步骤3 - 如果文件不存在,请确认您有权在当前工作目录中创建新文件。
步骤4 - 如果完成所有操作后仍然出现错误,请检查errno
。除了“它不起作用”之外,它还会为您提供一些其他信息。
#include <errno.h>
...
if(fd == -1)
{
switch( errno )
{
case EACCESS: // permission issues
handle_permission_issue();
break;
case EEXIST: // file already exists and you used O_CREAT and O_EXCL
handle_already_exists_issue();
break;
case EFAULT: // bad path
handle_bad_path_issue()
break;
...
}
printf("file read failed\n");
}
NetMage已经指出了一个问题 - 你的标志需要一起按位OR,而不是作为单独的参数列出。令人惊讶的是编译器没有对你大喊大叫。
答案 2 :(得分:0)
Per the POSIX documentation for open()
(稍微重新格式化,并注意粗体文字):
<强>概要强>
#include <sys/stat.h> #include <fcntl.h> int open(const char *path, int oflag, ...);
...
oflag的值由标记的按位包含OR构成 来自以下列表,定义于。 申请人应 准确指定前五个值中的一个(文件访问模式) 以下是oflag的值:
O_EXEC
仅供执行(非目录文件)。如果将此标志应用于目录,则结果未指定。O_RDONLY
仅供阅读。O_RDWR
开放阅读和写作。如果将此标志应用于FIFO,则结果未定义。O_SEARCH
打开目录仅供搜索。如果将此标志应用于非目录文件,则结果未指定。O_WRONLY
仅供写作。...
您需要至少包含这五个标志中的一个,可能是:
int fd = open(filepath, O_WRONLY|O_CREAT|O_APPEND, S_IWGRP);
请注意,其他故障仍可能发生。如评论中所述,您将"./"
置于文件名之前,例如,如果您通过"/tmp/filename"
且tmp
目录没有&#39},则可能会导致问题; t存在于当前工作目录中,因为open()
不会在任何路径中创建缺少的目录。