unix環境高級編程第三版pdf,標準IO庫--unix環境高級編程讀書筆記

 2023-11-19 阅读 25 评论 0

摘要:???? 標準IO庫是C語言提供的一個庫,不光存在于linux中,在windows中也是有的。標準IO庫和文件IO的不同是,標準IO庫是對文件IO(即系統調用)的封裝,并且在用戶層添加了一些緩沖區。 ???? 文件IO的所有操作都是針對文件描述符進行的&#x

???? 標準IO庫是C語言提供的一個庫,不光存在于linux中,在windows中也是有的。標準IO庫和文件IO的不同是,標準IO庫是對文件IO(即系統調用)的封裝,并且在用戶層添加了一些緩沖區。

???? 文件IO的所有操作都是針對文件描述符進行的,而標準IO則使用文件指針。當打開或創建一個文件時,標準IO使得文件與一個流相結合。例如,用fopen打開一個文件,則返回一個FILE結構體的指針,所有的操作都是通過FILE指針進行的。FILE結構體中包含了文件的描述符,緩沖區的長度,指向緩沖區的指針以及文件的出錯標記等。unix環境高級編程第三版pdf。

???? 在文件IO一章中,說明了標準輸入輸出對應的三個文件的文件描述符分別是STDIN_FILENOSTDOUT_FILENO以及STDERR_FILENO,它們對應的文件指針分別是stdinstdoutstderr

???? 標準IO的緩存可以分為一下三種:

?全緩存:在全緩存的情況下,只有當在用戶區的緩存裝滿或者調用fflush函數時,才會將緩存中的內容寫入到內核,在通過內核寫入到文件中去。行緩存:在行緩存的情況下,只有當遇到一個換行符時,才會進行IO操作。不緩存:就是沒有緩存。

全緩存一般用于非交互式的文件存取中,例如讀一個制定的文本文件一般采用全緩存的方式。行緩存常用于終端的交互。c++筆記?例如,標準輸入和標準輸出就采用行緩存。不緩存的情況就是標準出錯了,在這中情況下,要求將出錯信息盡快的輸出,當然不能使用緩存了。

???? 可以使用setbufsetvbuf來設置一個流的緩存,它們的函數原型如下:

     int setbuf(FILE* fp,char* buf);int setvbuf(FILE* fp,char* buf,int mode,size_t size);

如果函數執行成功返回0,否則返回非0setbuf第一個參數為文件指針,第二個參數buf必須指向一個長度為BUFSIZ的緩沖區,BUFSIZstdio.h頭文件中定義。如果bufNULL,則為不帶緩存。setvbuf第一個參數為文件指針,第二個參數為緩沖區的指針,第三個參數指定緩存的方式,第四個參數指定緩存的長度。數據結構讀書筆記5000。mode可選擇的有一下類型:

_IOFBF全緩存
_IOLBF行緩存
_IONBF無緩存

如果該流是帶緩存的,即mode的值不是_IONBF,但是buf的值為NULL,則系統自動為該流分配緩存。如果mode_IONBF,則忽略bufsize的值。設置緩存的工作一定要在流還沒有進行任何的操作之前進行,否則第一次對劉德操作將導致緩存的自動分配。一般來說,緩存的分配應該有系統自動進行,這樣就可以在關閉流的時候,自動釋放分配的緩存。

我們可以使用fflush強制刷新一個緩存,它的函數原型如下:

  int fflush(FILE* fp);

???? linux中,刷新有兩個意思,

1)強制將緩存中的數據寫入到磁盤上,即使緩存沒有寫滿

2)強制將緩存中的數據丟棄

在這里fflush當然是第一種操作。

???? 打開流的操作有三個函數:

FILE* fopen(const char* filename,const char* type);
FILE* freopen(const char* pathname,const char* type,FILE* fp);
FILE* fdopen(int filedes,const char* type);

如果函數執行成功,則返回文件指針,否則返回空指針NULL。redis筆記?type用來指定文件的打開方式,它的選擇有r,w,a,rb,wb,ab,r+,w+,a+。第二個函數是在一個特定的流上打開一個文件,如果該流已經打開,則先將該流關閉。此函數一般用于將指定的文件打開為一個預定義的流,如標準輸入,標準輸出和標準出錯。在使用fopen函數創建一個文件時,沒有辦法指定新建文件的權限。在linux系統中規定,新建的文件的權限為S_IRUSR| S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH

???? 使用fclose函數關閉一個流,它的函數原型如下:intfclose(FILE*fp);當關閉一個流時,會自動刷新輸出緩存中的數據,丟棄輸入緩存中的數據。unix。如果緩存是自動分配的,則會自動釋放緩存。

???? 一次從文件中讀取一個字符的函數有getcfgetcgetchargetcfgetc的功能是相同的,只不過getc是用宏來實現的,fgetc使用函數來實現的。所以說,getc的效率要比fgetc的效率高一些。而個getchar直接是從標準輸入讀取字符的。這三個函數的函數原型如下:

int getc(FILE* fp);
int fgetc(FILE* fp);
int getchar(void);

與之對應的三個輸出函數分別是:

int putc(int c,FILE* fp);
int fputc(int c,FILE* fp);
int putchar(int c);

putchar直接輸出到標準輸出。Java筆記?ungetc可以將讀出的字符重新送回到流中:

int ungetc(int c,FILE* fp);

???? 可以使用ferrorfeof來檢測在操作流的過程中是碰到了文件的末尾,還是發生了錯誤。可以使用clearerr函數來清除FILE中的erroreof標志。

???? 每次輸入一行的IO操作有,getsfgets,它們的函數原型如下:

char* gets(char* buf);
char* fgets(char* buf,int n,FILE* fp);

gets函數直接從標準輸入接收字符串,緩沖區buf的長度由stdio.h文件中的BUFFSIZ指定,用戶不能指定緩沖區的大小。所以,當輸入的字符足夠長,就會越出buf的緩沖區,從而造成不可預測的后果,這個漏洞就曾經被人利用,造成1988年的因特網蠕蟲病毒事件。所以gets函數是不建議使用的。與這兩個函數相對應的輸出函數是putsfputs

int puts(const char* str);
int fputs(const char* str,FILE* fp);

puts將指定的字符串輸出到標準輸出,并且輸出一個換行符。unix高級編程技術,freadfwrite函數用來對二進制文件進行操作,它一般用來向文件中寫入(或從文件中讀出)若干數目的結構體。

???? 對流的定位可以使用ftellfseek以及fgetposfsetpos。格式化輸出函數有三個:printffprintfsprintf,對應的格式化輸入函數有scanffscanf以及sscanf。在標準io庫中提供了兩個用于創建臨時文件的函數tmpnamtmpfile


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/183627.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息