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

时间:2017-10-30 19:17:42

标签: 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) 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;
}

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

3 个答案:

答案 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()不会在任何路径中创建缺少的目录。