gpt4 book ai didi

c++ - 在字符串上使用 open (unix)

转载 作者:太空宇宙 更新时间:2023-11-04 05:03:28 24 4
gpt4 key购买 nike

我正在尝试使用 open,手册页中对此进行了描述:

int open(const char *路径名, int 标志);

所以我这样调用它:

int fd = open(filename.c_str(), O_RDWR|O_CREAT);
if(fd == -1)
{
perror("There is something wrong with open: ");
}

其中 filename 是从 char 数组转换而来的字符串。更具体地说:

string filename = string(&a2[0], 1024);

其中 a2 是大小为 1024 的字符数组。

我遇到的错误是该文件不存在,这很奇怪,因为我将 O_CREAT 作为我的标志之一。

我非常感谢任何帮助!另外,这是我的第一篇文章,所以如果您需要更多信息/更好的格式,请告诉我!

编辑:修正了一些错别字,抱歉大家!我使用的是字符串,但我使用的是 c_str 函数,因此它确实可以编译。我不小心在我的第一篇文章中遗漏了这一点,还有另一个拼写错误。

最佳答案

你读过open(2)吗?仔细查看手册页;错误情况包括

   ENOENT O_CREAT is not set and the named file does not exist.  Or, a
directory component in pathname does not exist or is a
dangling symbolic link.
   ENOENT pathname refers to a nonexistent directory, O_TMPFILE and one
of O_WRONLY or O_RDWR were specified in flags, but this kernel
version does not provide the O_TMPFILE functionality.

因此,如果您打开类似bad/path/foo的东西(并且bad/path不存在),即使使用O_CREAT它也会失败。 (您可能需要多次调用 mkdir(2) ,例如,在 bad 上,然后在 bad/path 上,就像 mkdir(1) 命令对 -p 所做的那样...)

另请参阅path_resolution(7)

您可以使用strace(1)查找您的程序正在使用哪些系统调用以及哪些参数。

您应该始终测试 open(2) 等系统调用是否失败,然后使用 errnoperror

当然,open 不需要 std::string ;使用它的c_str获取内部 const char* C 字符串的成员函数。

顺便说一句,您应该使用 g++ -Wall -g 进行编译并学习如何使用 gdb 调试器。在 open 调用上设置断点比在 StackOverflow 上询问要快。

您的 a2 数组是否已正确初始化?它的值(value)是什么?用调试器检查一下!我会初始化

 string filename(a2);

但是您可以直接将 a2 传递给 open

关于c++ - 在字符串上使用 open (unix),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25337175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com