為什么我不能使用 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
uj5u.com熱心網友回復:
的兩種用法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()接受三個引數 - the const char *path、 theint oflag和變數 argument mode_t mode,它僅用于新創建的檔案以指定可用于檔案的最寬松的訪問模式(由行程的umask設定修改)。mode只需要O_CREAT在oflagflags 變數中設定時提供。
你濫用了oflag和mode論點。
一個正確的使用是open()這樣的:
if(append)
d= open(outputPathName, O_WRONLY|O_CREAT|O_APPEND, 0644 );
else
d= open(outputPathName, O_WRONLY|O_CREAT, 0644 );
根據 [POSIXopen()檔案]( 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() 函式應回傳命名檔案的檔案描述符,如檔案描述符分配中所述分配。打開的檔案描述是新的,因此檔案描述符不應與系統中的任何其他行程共享。除非在oflag 中設定了O_CLOEXEC 標志,否則與新檔案描述符相關聯的FD_CLOEXEC 檔案描述符標志應被清除。
用于標記檔案中當前位置的檔案偏移量應設定為檔案的開頭。
打開檔案描述的檔案狀態標志和檔案訪問模式應根據oflag的值設定。
的值
oflag由以下串列中的標志的按位包含 OR 構造,在 中定義<fcntl.h>。應用程式應在 oflag 的值中準確指定以下前五個值(檔案訪問模式)之一:
O_EXEC打開僅執行(非目錄檔案)。如果將此標志應用于目錄,則結果未指定。
O_RDONLY僅供閱讀。...
O_CREAT如果檔案存在,則此標志無效,除非O_EXCL如下所述。否則,如果O_DIRECTORY未設定,則將檔案創建為常規檔案;檔案的用戶ID應設定為行程的有效用戶ID;檔案的組ID應設定為檔案父目錄的組ID或行程的有效組ID;并且<sys/stat.h>檔案模式的訪問權限位(參見 )應設定為oflag作為型別的引數后面的引數值mode_t修改如下:對檔案模式位和行程的檔案模式創建掩碼的補碼中的相應位執行按位與。因此,在檔案模式創建掩碼中設定了相應位的檔案模式中的所有位都被清除。當設定了檔案權限位以外的位時,效果是未指定的。引數后面的oflag引數不影響檔案是為讀取、寫入還是兩者都打開。實作應提供一種將檔案的組 ID 初始化為父目錄的組 ID 的方法。實作可以但不需要提供實作定義的方法來將檔案的組 ID 初始化為呼叫行程的有效組 ID。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/382572.html
上一篇:當函式引數與c中的const引數宣告不匹配時編譯的程式
下一篇:如何繼續回圈遍歷GLfloat點
