【问题标题】:Why can't I open my file using open method?为什么我不能使用 open 方法打开我的文件?
【发布时间】:2022-01-18 23:16:22
【问题描述】:

为什么我无法使用 open 方法打开我的文件?

这是我的源代码:

char* dest;
char cwd1[256];
if (getcwd(cwd1, sizeof(cwd1)) == NULL)
perror("getcwd() error\n");
else
    dest=cwd1;    
char* destPlus=strcat(dest,"/");
char*myPathName =strcat(destPlus,fileName);
printf("the path name1: %s \n",myPathName);
char* outputPathName=myPathName;
int d;
// FILE* fd;
if(append)
    d= open(outputPathName, O_WRONLY, O_APPEND | O_CREAT|O_WRONLY|O_TRUNC);
else
    d= open(outputPathName, O_WRONLY,O_CREAT|O_WRONLY|O_TRUNC);
if(d<0){
    printf("hello, there's an error with your file, plz check it out\n");
    return;
}

在这段代码中 d 将是负数,为什么? 注:路径是真的我查了一下,错误号是2

【问题讨论】:

  • 你是在追加还是不追加?而 errno 的值为 ...?
  • 您是否尝试检查outputPathName 的值?是否有意义?您是否尝试检查errno 结果?报什么错误?
  • 所有不同的点变量有什么用?你只需要一个数组来保存所有相关的部分,足够大以适应路径和所有你需要添加到它的蚂蚁。然后使用snprintf 使用所需的所有信息对其进行格式化。最后将此格式化字符串传递给open。此外,print 该数组中的字符串,在开头和结尾加上引号,以确保没有前导 ot 尾随空格。并打印open设置的实际错误(例如strerror(errno)
  • 路径名是真的我查了一下,errno是2
  • @Someprogrammerdude,谢谢兄弟,我试试。

标签: c linux


【解决方案1】:

open 的两种用法都是错误的:

if(append)
    d= open(outputPathName, O_WRONLY, O_APPEND | O_CREAT|O_WRONLY|O_TRUNC);
else
    d= open(outputPathName, O_WRONLY,O_CREAT|O_WRONLY|O_TRUNC);

open() 接受三个参数 - const char *pathint oflag 和可变参数mode_t mode,仅用于新创建的文件,以指定可用于文件(由进程的umask 设置修改)。仅当在 oflag 标志变量中设置了 O_CREAT 时,才需要提供 mode

您同时滥用了 oflagmode 参数。

open() 的正确用法应该是这样的:

if(append)
    d= open(outputPathName, O_WRONLY|O_CREAT|O_APPEND, 0644 );
else
    d= open(outputPathName, O_WRONLY|O_CREAT, 0644 );

根据 [POSIX open() 文档](https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/open.htm

概要

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

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

描述

open() 函数应在文件和文件之间建立连接 一个文件描述符。它应该创建一个打开的文件描述, 引用文件和引用该打开文件的文件描述符 描述。文件描述符被其他 I/O 函数用于 参考那个文件。 path 参数指向一个名为 文件。

open() 函数应返回指定文件的文件描述符, 如文件描述符分配中所述分配。打开的文件 描述是新的,因此文件描述符不应共享 它与系统中的任何其他进程。 FD_CLOEXEC 文件 与新文件描述符关联的描述符标志应为 除非在 oflag 中设置了 O_CLOEXEC 标志,否则清除。

用于标记文件中当前位置的文件偏移量 应设置为文件的开头。

打开文件的文件状态标志和文件访问模式 描述要根据oflag的值来设置。

oflag 的值由标志位按位或构成 来自以下列表,在&lt;fcntl.h&gt; 中定义。申请应 指定以下前五个值(文件访问模式)之一 在oflag的值中:

O_EXEC 仅打开执行(非目录文件)。结果是 如果此标志应用于目录,则未指定。

O_RDONLY 只读。

...

O_CREAT 如果文件存在,则此标志没有任何作用,除非另有说明 在O_EXCL 下。否则,如果O_DIRECTORY没有设置文件 应创建为常规文件;文件的用户 ID 应为 设置为进程的有效用户ID;文件的组 ID 应设置为文件父目录的组 ID 或 进程的有效组ID;和访问权限位(见 &lt;sys/stat.h&gt;) 的文件模式应设置为 oflag 参数后面的参数被视为类型 mode_t 修改如下:对文件模式位执行按位与 以及进程文件模式的补码中的相应位 创作面具。因此,文件模式中的所有位与其对应的位 在文件模式创建掩码设置被清除。当其他位 比文件权限位设置,效果是未指定的。这 oflag 参数后面的参数不影响 文件已打开以供读取、写入或两者兼而有之。实施应 提供一种将文件的组 ID 初始化为 父目录。实现可以但不必提供一个 实现定义的将文件的组 ID 初始化为 调用进程的有效组ID。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多