Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用O|u APPEND | O|u CREATE打开文件后写入文件时出错_C_Operating System - Fatal编程技术网

使用O|u APPEND | O|u CREATE打开文件后写入文件时出错

使用O|u APPEND | O|u CREATE打开文件后写入文件时出错,c,operating-system,C,Operating System,我在O|u APPEND | O|u create模式下打开了一个名为“pranav”的文本文件,如下所示: #include<unistd.h> #include<fcntl.h> #include<stdio.h> main() { //FILE Descriptor fdes /*Open file pranav.txt in write-only mode, O_CREA

我在O|u APPEND | O|u create模式下打开了一个名为“pranav”的文本文件,如下所示:

     #include<unistd.h>
     #include<fcntl.h>
     #include<stdio.h>
     main()
     {
     //FILE Descriptor fdes
     /*Open file pranav.txt in write-only mode,
      O_CREAT creates file if it does not exist*/
      int fdes = open("pranav.txt",O_APPEND | O_CREAT );
      //Error returns -1
      if(fdes!=-1)
      {
           //To write on file
             if((write(fdes,"Pranav",6))== -1)
             write(2,"File_Writing_Error",18);
             //To print on screen
             else
             write(1,"Done",4);
      }
      else
      {
            //Print "error" on screen
               write(2,"File_Opening_Error",18);
      }
      close(fdes);
       }
#包括
#包括
#包括
main()
{
//文件描述符
/*以只写模式打开文件pranav.txt,
O_create创建不存在的文件*/
int fdes=open(“pranav.txt”,O|u APPEND | O|u CREAT);
//错误返回-1
如果(fdes!=-1)
{
//存档
如果((写入(fdes,“Pranav”,6))=-1)
写入(2,“文件写入错误”,18);
//在屏幕上打印
其他的
写(1,“完成”,4);
}
其他的
{
//在屏幕上打印“错误”
写入(2,“文件打开错误”,18);
}
关闭(fdes);
}

在O_追加模式下执行写入(2,“文件写入错误”,18);语句,因此无法在文件中写入“Pranav”,但如果我使用O_WRONLY模式,则不会发生此错误,并且程序会成功运行。
open
的文档说,您必须只给出一个标志
O_RDONLY
O_WRONLY
O_RDWR
,您可以使用其他标志的任意组合,如
O_APPEND
O_create

除了
O_APPEND
O_create
之外,您没有提供
O_WRONLY
。我的猜测是
O_RDONLY
为0,因此当不提供某个访问标志时,您将以
O_RDONLY
结束,因此无法写入文件

因此,正确的代码应该是:

mode_t mode = S_IRWXU | SIRWXG;  // or any other mode
int fdes = open("pranav.txt", O_APPEND | O_CREAT | O_WRONLY, mode);

请注意,如果标志包括
O_create
O_TMPFILE
open
的文档中规定,您必须只给出一个标志
O_RDONLY
,则需要附加参数
mode
O_WRONLY
O_RDWR
,您可以使用其他标志的任意组合,如
O_APPEND
O_create

除了
O_APPEND
O_create
之外,您没有提供
O_WRONLY
。我的猜测是
O_RDONLY
为0,因此当不提供某个访问标志时,您将以
O_RDONLY
结束,因此无法写入文件

因此,正确的代码应该是:

mode_t mode = S_IRWXU | SIRWXG;  // or any other mode
int fdes = open("pranav.txt", O_APPEND | O_CREAT | O_WRONLY, mode);

请注意附加参数
mode
,如果标志包括
O_create
O_TMPFILE

使用
perror
()打印实际错误消息使用
perror()
函数了解错误谢谢您增加我的知识。它打印了错误:“坏文件描述符”使用
perror
()打印真正的错误消息使用
perror()
函数了解错误谢谢您增加了我的知识。它大量打印错误:“错误的文件描述符”。我以前认为O_APPEND是O_WRONLY的替代品,现在我知道它可以与O_WRONLYThanx结合使用。我以前认为O_APPEND是O_WRONLY的替代品,现在我知道它可以与O_WRONLY一起使用