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

C++ 在字符串上使用open(unix),c++,linux,unix,C++,Linux,Unix,我正在尝试使用open,手册页中对此进行了描述: int打开(常量字符*路径名,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], 102

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

int打开(常量字符*路径名,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_create作为我的标志之一

我非常感谢任何帮助!此外,这是我的第一篇文章,所以如果你需要更多信息/更好的格式,请让我知道

编辑:修正了一些拼写错误,对不起大家!我使用的是一个字符串,但我使用的是c_str函数,所以它可以编译。在我的第一篇文章中意外地遗漏了这一点,还有另一个打字错误。

您仔细阅读手册了吗;错误案例包括

因此,如果您
open
类似
bad/path/foo
(并且
bad/path
不存在),即使使用
O_create
也会失败。(您可能需要调用几次,例如在
bad
上,然后在
bad/path
上,就像命令对
-p
所做的那样)

另见

您可以使用查找您的程序正在使用的syscalls和参数

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

当然,
open
不需要;使用其成员函数获取内部的
const char*
C字符串

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

您的
a2
数组是否正确初始化?它的价值是什么?检查调试器!我会初始化

 string filename(a2);

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

这是真正的代码,只是它看起来不应该编译?它应该是
int fd=open(文件名,O_RDWR | O_create)几个问题:函数调用中“|”(或)运算符后面的额外“')。其次,
open
需要一个
char*
作为文件名,您提供的是一个
字符串,这是不同的。也许您可以使用
filename.c_str()
。。。但是C++字符串与C’字符串不一样。<代码> PrRor(文件名,CyString)()提供了一个更有用的错误消息。我尝试通过我的字符数组(A2)打开,但它不工作。下面是我如何构建我的char数组:
chara2[1024]={0};对于(int d=pos+1;d<1024;d++){a2[d]=str[d];}
您真的应该使用调试器。@除非
str[]
是(a)也是1024个字符宽,并且(b)在str[1023]或之前有一个终止符,否则将导致非终止。此外,如果
str[]
的宽度不超过1024个字符,并且
a2[]
的宽度不超过
pos+1024+1
个字符,则这是完全未定义的行为。现在用一个
main()
来编写一个独立的代码列表,它再现了您真正的问题,并将其发布到您的问题中。猜测您没有向我们展示的代码是什么,并且必须一次一行地将其撬出来,这是没有效率的。
   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.
 string filename(a2);