C open() 函数失败。难道是我的参数不对?

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

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

最佳答案

第 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 指出了一个问题 - 您的标志需要按位或组合在一起,而不是作为单独的参数列出。令人惊讶的是编译器没有因此对你大喊大叫。

关于C open() 函数失败。难道是我的参数不对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47022712/

相关文章:

c - 如果键入 < max args,如何在用户按 Enter 时停止 fscanf

c - 文件内容到大字符串

c - 从 C 文件中排序单词和数字

c - 如何从Linux中的C获取当前时间(以毫秒为单位)?

linux - 受限设备上的 MPI 是 Linux 上进程间通信的良好选择吗?

c - 试图在 c 中使用 strtok 摆脱一个角色

c - 为什么我不能释放内存?

objective-c - 在 C 预处理器中生成随机标识符以避免重复的链接器符号

linux - 重命名文件夹中的所有文件

posix - IEEE Std 1003.1, 2004 Edition : POSIX. 1-2001 或 POSIX.1-2004 的正确名称是什么?