筆記:
/*
#include
#include
#include
#include
intopen(const char *pathname, int flags);
intopen(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
當flags包含o_creat時,需要加引數mode。其他情況不用mode引數,加了也被忽略。
ssize_t read(int fd, void *buf, size_t count);
從fd中讀取count大小的位元組內容到buf中。返回讀到的長度,出錯返回-1。返回值可能比count小,這不被認為時錯誤,原因可能是檔案本來就沒有那麼多東西讀(已到達檔案末尾,或者從pipe或terminal讀),也可能是被訊號打斷了。
ssize_t write(int fd, const void *buf, size_t count);
從buf中寫count大小的位元組內容到fd。返回寫入的長度(0表示沒寫進去任何東西),出錯返回-1。實際寫入位元組數可能比count小,這不算錯誤,原因可能是因為磁碟中沒有更多空間讓你寫了,或者檔案大小已超過rlimit_fsize限制,或者寫的過程中被訊號打斷了。
o_creat需要讀寫buffer對齊。
o_rdonly, o_wronly, o_rdwr的值分別為0,1,2,因此,o_rdonly|o_wronly和o_rdwr不一樣哦。
open()可以建立裝置檔案,但creat()不行,可以用mknod。
o_nonblock通常只用在你想開啟檔案但不想去讀寫,例如開啟裝置檔案只進行ioctl操作。
用file指標開啟和讀寫檔案:
#include
file *fopen(const char *path, const char *mode);
其中mode可以取:
r 讀方式開啟,檔案pos在檔案開頭。
r+ 讀寫方式開啟,檔案pos在檔案開頭。
w 寫方式開啟,將檔案truncate到0,如果檔案不存在則新建。檔案pos在檔案開頭。
w+ 讀寫方式開啟,將檔案truncate到0,如果檔案不存在則新建。檔案pos在檔案開頭。
a 追加方式開啟,如果檔案不存在則新建。檔案pos在檔案末尾(eof)。
a+ 讀和追加方式開啟,如果檔案不存在則新建。讀時檔案pos在檔案開頭,寫時pos在檔案末尾(eof)。
b 二進位制方式,可加在上述mode的後面或mode組合的中間。在一些系統上,文字檔案和二進位制檔案處理方式不同,想要讀二進位制就要加這個。
size_t fread(void *ptr, size_t size, size_t nmemb, file *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
file *stream);
注意fread不會區分end-of-file和error,返回值都會小於你本要寫的長度,要通過feof()和ferror()做進一步判斷。
int fseek(file *stream, long offset, int whence);//引數同lseek。第二個引數要傳long型。成功返回0.
long ftell(file *stream);//獲得當前pos。
void rewind(file *stream);//把檔案流的pos指向0位置。同(void) fseek(stream, 0l, seek_set);
char * readline (const char *prompt);
從命令列讀取一行,以字串形式給出結果。引數prompt通常為空,其他語言沒有這個引數。
readline遇到換行符或eof就返回,出錯也返回(null)。返回值為讀到的內容的指標(換行符被跳過,不返回)。
讀的buffer是內部分配的,所以用完後記得手動釋放掉。
讀不到換行是阻塞住不返回的。
如果一行除了eof沒有內容,函式返回null。
*/
示例程式:
#include
#include
#include
#include
#include
#define test_file_name "./ftest.txt"
int main()
#if 1
memset(rwbuf, 0, 64);
readc = read(fd, rwbuf, 64);
printf("%d, %s\n", readc, rwbuf); //不會因為'\0'或'\r''\n'停下來,並且它們也算一位元組長度。
//offset指向已經讀的下乙個位元組
curoffset = lseek(fd, 0, seek_cur); //seek_set, seek_end, seek_data, seek_hole
printf("offset = %d\n", curoffset);
lseek(fd, 12, seek_set); //lseek64?
writec = write(fd, "zhenfg", 6);
#else
memset(rwbuf, 0, 64);
readc = read(fd, rwbuf, 64);
int i;
for (i = 0; i < readc; i++) //可以讀取二進位制檔案。不像fopen還要加"b"模式
printf("\n");
#endif
close(fd);
return
0;}
讀寫檔案時的判斷示例:
#if 0
raw發包:
while (send_left > 0/* && try_time--*/)
else
}if (0 == sent_bytes)
bufp += sent_bytes;
send_left -= sent_bytes;
}讀body:
while (判斷) else
if (ret == -1) else }}
#endif
檔案的讀寫操作
說明 首先以讀寫方式開啟 r w a 都可以,不過要注意讀寫位置指標分別指向檔案頭 檔案頭 檔案尾 一次讀乙個字元 此時讀寫位置指標指向此位元組後面,判斷後,若要轉換,移動讀寫位置指標fseek fp,1l,seek cur 再寫入,由於在c中規定 以上述三種方式開啟檔案,既可讀又可寫,但 在沒有插...
檔案的讀寫操作
1.讀寫字元函式fgetc fputc int fgetc file stream 將流指標指向的檔案中的乙個字元輸出。若檔案指標指到檔案尾,會遇到檔案結束標誌eof 1 我們可以通過檢查該函式的返回值是否是 1來判斷是否已讀到檔案尾。int fputc int ch,file stream 將字元...
檔案的讀寫操作
1.read 會一次性讀取檔案的全部內容。2.readline 每次讀取一行,並且自帶換行功能,每一行末尾會讀到 n。3.readlines 一次性以行的形式讀取檔案的所有內容並返回乙個list,需要去遍歷讀出來。4.file控制代碼是乙個可迭代的物件因此,可以迴圈讀取檔案中的內容,每次讀一行。a ...