Linux應用程式設計學習記錄(二)

2021-08-25 13:54:45 字數 2413 閱讀 9602

今天來繼續學習檔案操作的相關api。早上查了下資料,發現現在學的這些api隸屬於posix標準,posix翻譯過來就是可移植作業系統介面,在unix類系統中應用的十分廣泛。處理檔案的api還有很多別的標準,比如ansi c標準,它應該是標準c語言提供的庫函式。在別人的文章中看到,這二者比較起來的話,posix應該是更底層的**,而ansi c是較為上層的**。換言之,你在linux中使用後者的某個函式來操作檔案,極有可能就是間接或者直接呼叫了前者中的對應函式。

1.    read函式

這個函式與write函式的功能正好相反,各引數的功能也可以模擬來記憶:

a)返回值是有符號整型,代表實際讀取到了幾個字元

b)第乙個引數是目標檔案的控制代碼

c)第二個引數是未指定型別的指標,其實就是某個緩衝區域的首位址,將來用來存放讀取的資料

d)第三個引數是希望讀取的位元組數

2.    read函式使用體驗

a)與write函式類似,read函式也存在對同乙個檔案多次讀取的情況。經過測試,確實還是像前者一樣,一旦開啟了乙個檔案。只要不關閉它,並且使用相同的檔案控制代碼,本次讀取就會在上一次末尾的地方自動接續。

b)確實像教材中說的那樣,如果文字中有6個字元,而你卻一次性要求讀取10個,那麼返回值會告訴你,只能讀出6個。

c)如果經過上次讀取操作,已經讀完了文字中的內容,你卻還要繼續讀取,那麼返回值會告訴你,已經見底了。

d)在測試中發現乙個有趣的現象,用write函式手寫的檔案,和自己用vi編輯器手寫的檔案有區別。同樣都是輸入abcdef這6個字元,用write函式寫入什麼就是什麼;用vi編輯器寫入,看起來好像也只有這6個字元。再用read函式去讀取並且用printf函式列印出來的時候就能看到,後者還多了個空格:

注:上圖中printf函式通過引數配置為右對齊顯示10個字元。

3.  貼上這部分的測試**

#include

#include

#include

#include

#include

#include //為了能執行printf函式所新增的標頭檔案

int main(int argc, char* argv)

/******************從檔案file1讀取資料到buf1*******************/

res = read(fd1, buf1, 10);

if (res == 0)

printf("read file1 to the end!\n");

else if (res <= -1)

printf("read file1 failed!\n");

else

/************************開啟檔案file2,獲取控制代碼****************************/

fd2 = open("file2.txt", o_rdwr);

if (fd2 < 0)

printf("open file2 failed!\n");

else

/******************從檔案file2讀取資料到buf2*******************/

res = read(fd2, buf2, 10);

if (res == 0)

printf("read file2 to the end!\n");

else if (res <= -1)

printf("read file2 failed!\n");

else

close(fd1);

close(fd2);

return 0;

}4.  close函式

這個函式與open相對應,用法十分簡單。

a)返回值是有符號整型資料,只有兩種可能:0代表正常關閉,-1代表失敗

b)只有乙個引數,檔案控制代碼

5.  一些有意思的細節

當我們對檔案進行讀操作的時候,往往一次不會全部讀出來。比如乙個檔案中有10個字元,我一次唯讀5個字元。完事以後還想把它列印出來顯示一下。我採用的方法是:

printf("they are %5s",buf);

這種方法指定列印緩衝區5個字元,並且右對齊。我在教材上看到另一種做法:

res = read(fd, buf, 5);

buf[res]='\0';

在read之後,立即給buf手動加上乙個字串結束標誌的'\0',這樣再用printf的時候就不用指定顯示幾個字元了。碰到字串結束標誌的時候,printf知道見好就收~

這種方法的好處在於,有時候你根本不知道能讀出幾個字元,,這時候還怎麼指定?另外,而res能夠忠實的反饋到底讀出來幾個字元。因此buf[res]='\0';  這種方法能保證'\0'正好加在最後乙個有效字元的後面。

Linux應用程式設計學習記錄(一)

今天學習了讀寫檔案函式的相關知識,參考的書籍是周立功寫的 嵌入式linux開發教程 上冊 第11.3節。1.open函式和creat函式 因為creat函式可以用open函式來實現,所以就不再去理會它了。關於open函式,記憶起來可以拆解成幾點 a 有int型返回值,返回的是所開啟檔案的控制代碼,或...

Linux應用程式設計學習記錄(三)

1.lseek函式 前兩次已經學過了write和read函式,這兩個函式在使用中可能存在對同乙個檔案多次操作的問題,因此不得不關注讀寫的起點是哪兒。假設有這麼乙個需求 乙個檔案中有6個字元,開啟檔案後我希望直接讀取第4個字元,這怎麼辦?顯然直接讀取是不行的了,你得移動讀寫起點。lseek函式就是為這...

Linux應用程式設計學習記錄(四)

今天開始學習關於程序的相關知識,參考的教材依然是周立功的 嵌入式linux開發教程 上冊 內容相當於第12章。因為沒多少機會寫 來體會,這部分內容可能會比較抽象,難以理解。總之乙個乙個來吧。初識程序 1.程序是乙個已經開始執行,但是還沒終止的程式例項。2.程序是乙個動態的實體,它是如何從靜態的程式轉...