1. 程式人生 > >Linux c中一些常用函式總結(c語言中文網。。。)

Linux c中一些常用函式總結(c語言中文網。。。)

fgets()函式

標頭檔案:include<stdio.h>

fgets()函式

標頭檔案:include<stdio.h>fgets()函式用於從檔案流中讀取一行或指定個數的字元,其原型為:    char * fgets(char * string, int size, FILE * stream);引數說明:

· string為一個字元陣列,用來儲存讀取到的字元。

· size為要讀取的字元的個數。如果該行字元數大於size-1,則讀到 size-1 個字元時結束,並在最後補充' \0';如果該行字元數小於等於 size-1,則讀取所有字元,並在最後補充 '\0'。即,每次最多讀取 size-1 個字元。

· stream為檔案流指標。

【返回值】讀取成功,返回讀取到的字串,即string;失敗或讀到檔案結尾返回NULL。因此我們不能直接通過fgets()的返回值來判斷函式是否是出錯而終止的,應該藉助feof()函式或者ferror()函式來判斷。注意:fgets()與gets()不一樣,不僅僅是因為gets()函式只有一個引數 FILE *stream,更重要的是,fgets()可以指定最大讀取的字串的個數,杜絕了gets()使用不當造成快取溢位的問題。【例項】從myfile.txt檔案中讀取最多99個字元。

1. #include<stdio.h>

2. 

3. int

main()

4. {

5.     FILE * pFile;

6. char mystring [100];

7. 

8.     pFile =fopen("myfile.txt","r");

9. if(pFile == NULL)

10. perror("Error opening file");

11. else{

12. if(fgets(mystring ,100, pFile)!= NULL )

13. puts(mystring);

14. fclose(pFile);

15. }

16. return0;

17. }

又如,使用fputs()寫一個檔案,然後fgets()讀取檔案內容並顯示。

1. #include<stdio.h>

2. #include<stdlib.h>

3. #include<io.h>

4. #include<conio.h>

5. intmain(void)

6. {

7. char msg[]="This is a test!\n secend line\n";

8. char msgget[100];

9. int i =0;

10.     FILE* fstream;

11.     fstream =fopen("test.txt","w+");/*開啟檔案*/

12. if(fstream==NULL)

13. {

14. printf("Open file failed!\n");

15. exit(1);

16. }

17. fputs(msg, fstream);/*寫入檔案*/

18. fflush(fstream);

19. close(fileno(fstream));

20.     fstream=fopen("test.txt","r");

21.     i =0;

22. fgets(msgget,3,fstream);

23. fputs(msgget, stdout);

24. printf("\n");

25. fgets(msgget,100,fstream);/*從流中讀取一行或者指定個數字元*/

26. fputs(msgget, stdout);/*送一個字串到流中*/

27. return0;

28. }

執行結果:This is a test!Fputs

C語言庫函式 int fputs(const char *str, FILE *stream) 將一個字串寫入指定的流,但不包括空字元。

宣告

以下是宣告 fputs() 函式。

int fputs(const char *str, FILE *stream)

引數

· 

str -- 這是一個數組,包含null結尾的要寫入的字元序列。

· 

· 

stream -- 這是一個檔案物件的標識字串將被寫入流的指標。

· 

返回值

這個函式返回一個非負的值,否則,錯誤返回EOF。

例子

下面的例子顯示的使用fputs() 函式。

#include <stdio.h>

int main (){

   FILE *fp;

   fp = fopen("file.txt", "w+");

   fputs("This is c programming.", fp);

   fputs("This is a system programming language.", fp);

   fclose(fp);

   return(0);}

讓我們編譯和執行上面的程式,這將建立一個檔案file.txt 以下內容:

This is c programming.This is a system programming language.

關於重定向

I/O

cmd > file 把 stdout 重定向到 file 檔案中;

cmd >> file 把 stdout 重定向到 file 檔案中(追加)

cmd 1> file 把 stdout 重定向到 file 檔案中;

cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 檔案中;

cmd 2> file 把 stderr 重定向到 file 檔案中;

cmd 2>> file 把 stderr 重定向到 file 檔案中(追加)

cmd >> file 2>&1 把 stdout 和 stderr 一起重定向到 file 檔案中(追加)

cmd < file >file2 cmd 命令以 file 檔案作為 stdin,以 file2 檔案作為 stdout

cat <>file 以讀寫的方式開啟 file

cmd < file cmd 命令以 file 檔案作為 stdin

cmd << delimiter Here document,從 stdin 中讀入,直至遇到 delimiter 分界符。

進階I/O

>&n 使用系統呼叫 dup (2) 複製檔案描述符 n 並把結果用作標準輸出;

<&n 標準輸入複製自檔案描述符 n

<&- 關閉標準輸入(鍵盤);

>&- 關閉標準輸出;

n<&- 表示將 號輸入關閉;

n>&- 表示將 號輸出關閉;

上述所有形式都可以前導一個數字,此時建立的檔案描述符由這個數字指定而不是預設的 或 1。如:

... 2>file 執行一個命令並把錯誤輸出(檔案描述符 2)定向到 file

... 2>&1 執行一個命令並把它的標準輸出和輸出合併。(嚴格的說是通過複製檔案描述符 來建立檔案描述符 ,但效果通常是合併了兩個流。)

我 們對 2>&1詳細說明一下 :2>&1 也就是 FD2=FD1 ,這裡並不是說FD2 的值 等於FD1的值,因為 是改變送出的資料通道,也就是說把 FD2 的 資料輸出通道” 改為 FD1 的 資料輸出通道。如果僅僅這樣,這個改變好像沒有什麼作用,因為 FD2 的預設輸出和 FD1的預設輸出本來都是 monitor,一樣的! 但是,當 FD1 是其他檔案,甚至是其他 FD 時,這個就具有特殊的用途了。請大家務必理解這一點。

exec 1>outfilename # 開啟檔案outfilename作為stdout

exec 2>errfilename # 開啟檔案 errfilename作為 stderr

exec 0<&- # 關閉 FD0

exec 1>&- # 關閉 FD1

exec 5>&- # 關閉 FD5

Open()函式

相關函式:read, write, fcntl, close, link, stat, umask, unlink, fopen標頭檔案:#include <sys/types.h>    #include <sys/stat.h>    #include <fcntl.h>定義函式:    int open(const char * pathname, int flags);    int open(const char * pathname, int flags, mode_t mode);函式說明:引數 pathname 指向欲開啟的檔案路徑字串. 下列是引數flags 所能使用的旗標:O_RDONLY 以只讀方式開啟檔案O_WRONLY 以只寫方式開啟檔案O_RDWR 以可讀寫方式開啟檔案. 上述三種旗標是互斥的, 也就是不可同時使用, 但可與下列的旗標利用OR(|)運算子組合.O_CREAT 若欲開啟的檔案不存在則自動建立該檔案.O_EXCL 如果O_CREAT 也被設定, 此指令會去檢查檔案是否存在. 檔案若不存在則建立該檔案, 否則將導致開啟檔案錯誤. 此外, 若O_CREAT 與O_EXCL 同時設定, 並且欲開啟的檔案為符號連線, 則會開啟檔案失敗.O_NOCTTY 如果欲開啟的檔案為終端機裝置時, 則不會將該終端機當成程序控制終端機.O_TRUNC 若檔案存在並且以可寫的方式開啟時, 此旗標會令檔案長度清為0, 而原來存於該檔案的資料也會消失.O_APPEND 當讀寫檔案時會從檔案尾開始移動, 也就是所寫入的資料會以附加的方式加入到檔案後面.O_NONBLOCK 以不可阻斷的方式開啟檔案, 也就是無論有無資料讀取或等待, 都會立即返回程序之中.O_NDELAY 同O_NONBLOCK.O_SYNC 以同步的方式開啟檔案.O_NOFOLLOW 如果引數pathname 所指的檔案為一符號連線, 則會令開啟檔案失敗.O_DIRECTORY 如果引數pathname 所指的檔案並非為一目錄, 則會令開啟檔案失敗。注:此為Linux2. 2 以後特有的旗標, 以避免一些系統安全問題. 引數mode 則有下列數種組合, 只有在建立新檔案時才會生效, 此外真正建檔案時的許可權會受到umask 值所影響, 因此該檔案許可權應該為 (mode-umaks).S_IRWXU00700 許可權, 代表該檔案所有者具有可讀、可寫及可執行的許可權.S_IRUSR 或S_IREAD, 00400 許可權, 代表該檔案所有者具有可讀取的許可權.S_IWUSR 或S_IWRITE, 00200 許可權, 代表該檔案所有者具有可寫入的許可權.S_IXUSR 或S_IEXEC, 00100 許可權, 代表該檔案所有者具有可執行的許可權.S_IRWXG 00070 許可權, 代表該檔案使用者組具有可讀、可寫及可執行的許可權.S_IRGRP 00040 許可權, 代表該檔案使用者組具有可讀的許可權.S_IWGRP 00020 許可權, 代表該檔案使用者組具有可寫入的許可權.S_IXGRP 00010 許可權, 代表該檔案使用者組具有可執行的許可權.S_IRWXO 00007 許可權, 代表其他使用者具有可讀、可寫及可執行的許可權.S_IROTH 00004 許可權, 代表其他使用者具有可讀的許可權S_IWOTH 00002 許可權, 代表其他使用者具有可寫入的許可權.S_IXOTH 00001 許可權, 代表其他使用者具有可執行的許可權.返回值:若所有欲核查的許可權都通過了檢查則返回0 值, 表示成功, 只要有一個許可權被禁止則返回-1.錯誤程式碼:EEXIST 引數pathname 所指的檔案已存在, 卻使用了O_CREAT 和O_EXCL 旗標.EACCESS 引數pathname 所指的檔案不符合所要求測試的許可權.EROFS 欲測試寫入許可權的檔案存在於只讀檔案系統內.EFAULT 引數pathname 指標超出可存取記憶體空間.EINVAL 引數mode 不正確.ENAMETOOLONG 引數 pathname 太長.ENOTDIR 引數pathname 不是目錄.ENOMEM 核心記憶體不足.ELOOP 引數pathname 有過多符號連線問題.EIO I/O 存取錯誤.附加說明:使用 access()作使用者認證方面的判斷要特別小心, 例如在access()後再作open()空檔案可能會造成系統安全上的問題.範例#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>main(){    int fd, size;    char s[] = "Linux Programmer!\n", buffer[80];    fd = open("/tmp/temp", O_WRONLY|O_CREAT);    write(fd, s, sizeof(s));    close(fd);    fd = open("/tmp/temp", O_RDONLY);    size = read(fd, buffer, sizeof(buffer));    close(fd);    printf("%s", buffer);}執行Linux Programmer!

C語言read()函式:讀檔案函式(由已開啟的檔案讀取資料)

相關函式:readdir, write, fcntl, close, lseek, readlink, fread標頭檔案:#include <unistd.h>定義函式:ssize_t read(int fd, void * buf, size_t count);函式說明:read()會把引數fd 所指的檔案傳送count 個位元組到buf 指標所指的記憶體中. 若引數count 為0, 則read()不會有作用並返回0. 返回值為實際讀取到的位元組數, 如果返回0, 表示已到達檔案尾或是無可讀取的資料,此外檔案讀寫位置會隨讀取到的位元組移動.附加說明:如果順利 read()會返回實際讀到的位元組數, 最好能將返回值與引數count 作比較, 若返回的位元組數比要求讀取的位元組數少, 則有可能讀到了檔案尾、從管道(pipe)或終端機讀? ?蛘呤莚ead()被訊號中斷了讀取動作. 當有錯誤發生時則返回-1, 錯誤程式碼存入errno 中, 而檔案讀寫位置則無法預期.錯誤程式碼:EINTR 此呼叫被訊號所中斷.EAGAIN 當使用不可阻斷I/O 時(O_NONBLOCK), 若無資料可讀取則返回此值.EBADF 引數fd 非有效的檔案描述詞, 或該檔案已關閉.

1.Write函式

     用法:  #include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

引數:   fd:要進行寫操作的檔案描述詞。buf:需要輸出的緩衝區count:最大輸出位元組計數

使用時候偶然發現,如果設定開啟fb=open("/dev/fb0",O_RDONLY)之類的快取檔案,並且再開啟fb_tupian=open("tu.bin",O_RDONLY);並且將fb_tupian使用read(fb_tupian,buf,size);讀取之後,這個buf存放的就是tu.bin的資料

好了,問題出現了,當使用write(fb,buf,size)寫第一張圖片的時候還是正確的,但是當開啟例如:tu001.bin的buf001,發現,不能寫入framebuffer的fb檔案描述符下,因為由於前面寫的tu.bin的資料已經導致快取地址溢位,因此,後面的圖片再次使用write函式寫入到fb的時候,fb快取的地址沒有清到快取的首地址,因此溢位了LCD螢幕範圍。

解決的方法是:需要將該檔案close掉,再次開啟,才能進行重寫。

2.fread函式和fwrite函式

1.函式功能

  用來讀寫一個數據塊。

2.一般呼叫形式

  fread(buffer,size,count,fp);

  fwrite(buffer,size,count,fp);

3.說明

  (1)buffer:是一個指標,對fread來說,它是讀入資料的存放地址。對fwrite來說,是要輸出資料的地址。

  (2)size:要讀寫的位元組數;

  (3)count:要進行讀寫多少個size位元組的資料項;

  (4)fp:檔案型指標。

標頭檔案:#include <stdio.h>定義函式:size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);函式說明:fread()用來從檔案流中讀取資料.引數stream 為已開啟的檔案指標, 引數ptr 指向欲存放讀取進來的資料空間, 讀取的字元數以引數size*nmemb 來決定. Fread()會返回實際讀取到的nmemb 數目, 如果此值比引數nmemb 來得小, 則代表可能讀到了檔案的尾或有錯誤發生, 這時必須用feof()或ferror()來決定發生什麼情況.返回值:返回實際讀取到的nmemb 數目。範例#include <stdio.h>#define nmemb 3struct test{    char name[20];    int size;} s[nmemb];main(){    FILE * stream;    int i;    stream = fopen("/tmp/fwrite", "r");    fread(s, sizeof(struct test), nmemb, stream);    fclose(stream);    for(i = 0; i < nmemb; i++)        printf("name[%d]=%-20s:size[%d]=%d\n", i, s[i].name, i, s[i].size);}執行name[0]=Linux! size[0]=6name[1]=FreeBSD! size[1]=8name[2]=Windows2000 size[2]=11

標頭檔案:#include <stdio.h>fopen()是一個常用的函式,用來以指定的方式開啟檔案,其原型為:    FILE * fopen(const char * path, const char * mode);【引數】path為包含了路徑的檔名,mode為檔案開啟方式。mode有以下幾種方式:

開啟方式

說明

r

以只讀方式開啟檔案,該檔案必須存在。

r+

以讀/寫方式開啟檔案,該檔案必須存在。

rb+

以讀/寫方式開啟一個二進位制檔案,只允許讀/寫資料。

rt+

以讀/寫方式開啟一個文字檔案,允許讀和寫。

w

開啟只寫檔案,若檔案存在則長度清為0,即該檔案內容消失,若不存在則建立該檔案。

w+

開啟可讀/寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。

a

以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留(EOF符保留)。

a+

以附加方式開啟可讀/寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,則寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留(原來的EOF符 不保留)。

wb

以只寫方式開啟或新建一個二進位制檔案,只允許寫資料。

wb+

以讀/寫方式開啟或建立一個二進位制檔案,允許讀和寫。

wt+

以讀/寫方式開啟或建立一個文字檔案,允許讀寫。

at+

以讀/寫方式開啟一個文字檔案,允許讀或在文字末追加資料。

ab+

以讀/寫方式開啟一個二進位制檔案,允許讀或在檔案末追加資料。

在POSIX 系統,包含Linux 下都會忽略 b 字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask 值。二進位制和文字模式的區別:

· 在windows系統中,文字模式下,檔案以"\r\n"代表換行。若以文字模式開啟檔案,並用fputs等函式寫入換行符"\n"時,函式會自動在"\n"前面加上"\r"。即實際寫入檔案的是"\r\n" 。

· 在類Unix/Linux系統中文字模式下,檔案以"\n"代表換行。所以Linux系統中在文字模式和二進位制模式下並無區別。

更多資訊請檢視:C語言fopen()開啟文字檔案與二進位制檔案的區別有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。【返回值】檔案順利開啟後,指向該流的檔案指標就會被返回。若果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。注意:一般而言,開檔案後會作一些檔案讀取或寫入的動作,若開檔案失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。檔案操作完成後,需要將檔案關閉,一定要注意,否則會造成檔案所佔用記憶體洩露和在下次訪問檔案時出現問題。檔案關閉後,需要將檔案指標指向空,這樣做會防止出現遊離指標,而對整個工程造成不必要的麻煩,如fp = NULL。【例項】開啟一個檔案然後關閉該檔案。

1. #include<stdio.h>

2. #include<string.h>

3. #include<stdlib.h>

4. intmain()

5. {

6. 

7.     FILE* fstream;

8. char msg[100]="Hello!I have read this file.";

9.     fstream=fopen("test.txt","at+");

10. if(fstream==NULL)

11. {

12. printf("open file test.txt failed!\n");

13. exit(1);

相關推薦

Linux c一些常用函式總結c語言中文

fgets()函式 標頭檔案:include<stdio.h> fgets()函式 標頭檔案:include<stdio.h>fgets()函式用於從檔案流中讀取一行或指定個數的字元,其原型為:    char * fgets(char * 

numpy一些常用函式記錄3

1. np.prod()    : prod函式用於求陣列元素的乘積。 Note: 陣列沒有元素,即為空時,得到的值為 1.0 In [2]: np.prod([]) Out[2]: 1.0 In [4]: np.prod([[],[]]) Out[4]: 1.0

C++string常用函式及用法總結

標準c++中string類函式介紹 注意不是CString 之所以拋棄char*的字串而選用C++標準程式庫中的string類,是因為他和前者比較起來,不必 擔心記憶體是否足夠、字串長度等等,而且作為一個類出現,他整合的操作函式足以完成我們大多數情況下(甚至是1

關於C語言一些常用函式的說明

1.I/O函式 (1)scanf函式: int scanf(const char *format…..); 從標準輸入流stdin中按格式format將資料寫到引數表中;若操作成功,返回寫到引數表中的引數個數,否則返回EOF; 注意以下幾點: ①scanf函式沒

生產環境Oracle常用函式總結

1>to_char,將日期轉換為字元;add_months,在第一個引數的日期上加或者減第二個引數的值 select dkzh,jkhtbh,yhkrq,dkffrq,shqs,dqyqcs,to_char(add_months(dkffrq,shqs+dqyqcs+1),'yyyymm'

Python常用關鍵字和常用函式總結不定期更新

1.print('')            #可以直接列印字串&列表裡的所有資料,python2.x中print “” 無需加括號 2.轉換字串:str()    #將字元轉義成字串 3.字串:     (1)string.title()    #將字串轉義成標題(單詞首字母大寫)     (2)字

Mysql 常用函式總結加密解密函式

MD5(str) md5加密 SELECT MD5('hello') 5d41402abc4b2a76b9719d911017c592 sha(str) sha加密 SELECT SH

Open GL常用函式總結待更新

1.設定畫筆顏色 glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,0.0); 2.glFlush();//重新整理圖形,display函式末尾 3.glMatrixMode(GLenum mode)    &nb

Hive常用函式總結

這篇繼續我們介紹我們的函式,上篇連結: https://blog.csdn.net/Forever_ck/article/details/85268145 閒話少敘,開整: current_date 獲取當前日期 rtrim 去除字串右邊空格 split 將字串按

Hive常用函式總結

在我們開發數倉專案的過程中,我們常常需要寫一些複雜的 hql 語句來完成我們的業務邏輯,今天我們就來聊聊那些Hive中自帶的常用函式。 一、Hive中內建函式圖解 二、常用函式總結:(常用的數學和日期函式) round() 四捨五入取值 ceil 向上取整 sq

c記憶體分配與釋放malloc,realloc,calloc,free函式內容的整理

程式例2    從這個例子可以看出calloc分配完儲存空間後將元素初始化。   #include<stdio.h>   #include<stdlib.h>   int main(void)   {   int i;   int *pn=(int

Linux系統一些常用的配置檔案

        Linux系統下有一些重要的配置檔案,例如配置防火牆過濾的檔案iptables,該檔案在CentOS下的路徑為/etc/sysconfig/iptables。如果我們要配置防火牆,那必須編輯它,但是Linux系統這些配置檔案比較多,不可以記住每一個配置檔案的

C輸入輸出函式總結

輸入函式:scanf(),gets(),fgets(),fscanf(),fgets(); 輸出函式:printf(),puts(),fputs(),fprintf,fputs();  scanf() 在讀取字串時從第一個非 空白字元(空格,製表符,換行符) 開始讀自導

C++string erase 函式的使用 C++string erase函式的使用

轉 C++中string erase函式的使用 2017年04月05日 21:02:17 It_BeeCoder 閱讀數:4286 更多

string常用函式總結四(append和assignC++11

append(新增字元(串)) (1)basic_string& append(const basic_string& __str); //在字串末尾新增字串str (2) basic_string& append(const basic_st

C語言一些常用IO函式總結

scanf()函式格式化讀入函式,採用轉換說明匹配 scanf()通過%的形式對資料進行讀入,可以一次讀入多個數據。scanf的實現依靠指標所以有如下兩條規則: 1、scanf()讀入基本資料型別時,需要在變數名前加&。 2、scanf()讀入字串陣列時,不需要加。

python一些常用函式不定時更新

一、random函式 import random # 在1~20中隨機取一個數 print(random.choice(range(1, 20))) 9 # 在1~20中隨機取五個陣列成一個列表 print(random.choices(range(1, 20), k=5)) [3, 1

慢慢總結C語言一些常用函式

fgets 標頭檔案:    #include <stdio.h> 函式原型:char *fgets(char *s, int size, FILE *stream); 返回值:    成功時s指向哪返回的指標就指向哪,出錯或者讀到檔案末尾時返回NULL。 說明

c語言一些常用函式

1.sscanf() char s[100]; scanf("%s", s); int v; sscanf(&s[1], "%d", &v); 輸入s :(112, 334)  輸入s

C++ string.find() 函式的用法總結轉載

 #include <string>#include <iostream>using namespace std; void main() { ////find函式返回型別 size_type string s("1a2b3c4d5e6f7g8