檔案位置指針對read write的影響

2021-06-28 08:12:50 字數 1365 閱讀 4917

首先明確一下,同乙個檔案在同乙個程序中可以被開啟多次,只是返回的檔案描述符不同。

read、write、lseek都涉及到檔案指標,檔案指標是跟檔案描述符關聯在一起,跟物理檔案是分開的。

每個檔案描述符都有3個指標:begin、curr、end。可以有兩種方法更改curr指標:每次write或read的末位置就是curr指標的位置;使用lseek(int fd,int offset,int whence)。每次read都從curr位置開始,每次write都從begin位置開始。

看一段程式:

1 #include2 #include

3 #include4 #include5 #include6 #include7

8main();

21if(read(fd2,buf,4)<0

)22 perror("

read");

23 printf("

read from fd2 %s\n

",buf);

24 memset(buf,0x00,sizeof

(buf));

25if(read(fd1,buf,4)<0

)26 perror("

read");

27 printf("

read from fd1 %s\n

",buf);

28close(fd1);

29close(fd2);

30 }

輸出:

fd1=3 fd2=4

read from fd2 

read from fd1 456

在上面的程式中,先是通過fd1在檔案開頭寫入"123",呼叫

write(fd2,"456\n",4)時還是在檔案開頭寫入,所以把「123」覆蓋了。如果把第17行換成write(fd1,"456\n",4)則不會覆蓋之前寫入的內容。當呼叫lseek(fd1,0,seek_set)之後,read(fd1,buf,4)就是從檔案的開頭開始讀,而read(fd2,buf,4)是從write(fd2,"456\n",4)結束的位置開始讀,所以讀到的內容為空。

fork後子程序複製了父程序的檔案描述符。

#include#include

#include#include#include#include#include#include#includemain()

else

}

上述**相當於檔案被開啟了3次--所以也要close()3次。檔案最終的內容是:ab。

在父程序中已經開啟的檔案描述符(包括套介面描述符等),在子程序中可以直接使用,每fork一次,這些描述符的引用計數就被加1,所以也要關閉多次,直到引用計數為0.

檔案指標與檔案位置指標,檔案位置指標相關的庫函式

1 檔案指標 檔案指標是指向乙個檔案的指標,確切的是存放了用檔案這個結構體所定義的物件的起始位址,檔案指標的移動是指在檔案之間來移動,比如 file fp fp fopen programe test.txt a fp就表示檔案指標。問題 檔案指標能不能在檔案之間來回移動?如果能的話,需要先釋放檔案...

C語言 檔案位置指標

1 計算機為每個檔案保留乙個整數,這個整數表示下一次檔案讀寫操作開始的位置 所以每次讀取檔案讀到的是不一樣的 2 這個位置一定在兩個相鄰位元組之間 3 這個整數的數值就是檔案頭到這個位置之間包含的位元組個數 4 這個整數叫做檔案的位置指標 5 每當從檔案裡讀n個位元組或檔案裡寫入n個位元組之後位置指...

043 C 檔案位置指標

include using namespace std istream 和 ostream 都提供了用於重新定位檔案位置指標的成員函式。這些成員函式包括關於 istream 的 seekg seek get 和關於 ostream 的 seekp seek put seekg 和 seekp 的引數...