Linux學習之應用開發階段(標準IO一)

2021-08-28 21:19:01 字數 2537 閱讀 3314

言之者無罪,聞之者足以戒。 ——《詩序》

三類讀寫函式:

第一類:行快取 遇到換行符(\n)或寫滿快取時,即呼叫系統呼叫函式

讀:fgets,gets,printf,fprintf,sprintf

寫:fputs,puts,scanf

乙個字元的讀寫,是否是行快取?

讀:fgetc,getc,getchar

寫:fputc,putc,putchar

第二類:無快取 只要使用者呼叫這個函式,就會將其內容寫到核心中

stderr函式

下面的程式是可以輸出到螢幕的三種情況:

#include int main()

第一種是直接加換行符;第二種是強制重新整理寫入;第三種就是標準stderr

第三類:全快取 只有寫滿快取才呼叫系統呼叫函式

讀:fread

寫:fwrite

1) 行快取的讀寫函式fgets和fputs

char*fgets(char *s,int size,file *stream)

第乙個引數:快取,即讀到**去

第二個引數:讀多少個位元組

第三個引數:從什麼地方讀

返回值:若成功則為s(快取的位址),若已經處於檔案的尾端或出錯則為null

int fputs(const char *s,file *stream)

第乙個引數:快取,即寫什麼內容

第二個引數:寫到**去

若成功則為非負值,若出錯則為eof(等價於-1)

注意:我們前面說fputs是乙個行快取的函式,遇到換行符或寫滿快取時才會呼叫系統快取函式,但是我們測試的時候如果程式的末尾有fclose()函式,那麼即使沒有換行符也沒有寫滿它也會呼叫系統函式,這是因為上面我們所說過的fclose()函式的乙個重要的功能。

2)行快取的讀寫函式gets和puts

char *gets(char *s)

int puts(const char *s)

gets函式與fgets函式的區別:

(1)使用gets()函式時不能指定快取的長度,這樣就可能造成快取越界(如若該行長於快取長度),寫到快取之後的儲存空間中,從而產生不可預料的結果

(2)gets()函式只能從標準輸入中讀

(3)gets()函式不將新行符(換行符)存入快取中,fgets()函式將新行符存入快取中

puts函式與fputs函式的區別:

(1)puts()只能向標準輸出寫入

(2)puts函式輸出會新增乙個新行符,fputs函式不會新增

下面的程式將上面的內容做一下對比:

#include #include int main()

; int len;

//get(buf);

fgets(buf,128,stdin);

len=strlen(buf);

printf("len=%d\n",len);

puts(buf);

//fputs(buf,stdout);

return 0;

}

2、重新整理快取函式:

fflush(file *fp)

把庫函式中的快取的內容強制寫到核心中。

3、調整讀寫指標函式:

1)、fseek()引數與lseek是一樣的但是返回值不同

lseek()的返回值:當前檔案的位置指標

fseek()的返回值:成功返回0 ,失敗返回-1

關於fseek()的引數問題請看我的另一篇文章**(

2)、rewind(filefp)用於設定流的檔案位置指示為檔案開始,該函式呼叫成功無返回值。

rewind()等價於(void)fseek(fp,0,seek_set)

3)、ftell(filefp)用於取得當前的檔案位置,呼叫成功則為當前檔案位置指示,若出錯則為-1

下面貼上出乙個程式說明調整指標函式:

#include //#include //#include int main(int argc,char *argv)

; fp=fopen("./a.c","w+");

if(fp==null)

printf("open file a.c sucess\n");

fputs(buf,fp);

//fseek(fp,0,seek_set);

rewind(fp);

fgets(readbuf,128,fp);

printf("readbuf:%s\n",readbuf);

fclose(fp);

return 0;

}

注意:一般我們是先寫然後再去讀,但是如果寫完之後直接讀取那麼讀取的結果就是錯誤的,所以在寫過之後讀取之前我們需要把檔案指標指向要開始讀取的位置,這樣才能得到正確的結果。

Linux應用開發之執行緒

這一節我們來學習一下執行緒,首先來看一下執行緒建立函式 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg 第乙個引數thread 這個引數儲存的是建立了的執行緒...

Linux 應用開發 之 SPI

int open const char file,int oflag int fd open device,o rdwr if fd 0 配置 spi 模式 void setspimode int fd,unsigned short mode ret ioctl fd,spi ioc rd mode...

uml學習 在軟體開發各個階段應用

三 講完例子之後就講了uml在軟體開發各個階段的應用。只是理論上的一些術語吧。要想真的去懂,還是得做例子。uml在軟體開發各個階段的應用 採用物件導向技術設計軟體系統時,使用用例圖來描述使用者需求 使用類圖 物件圖 包圖 構件圖和部署圖描述系統的靜態結構 使用順序圖 合作圖 活 和狀態圖描述動態行為...