Linux的文件標識符,和Windows的就是文件名不同,它相當於文件的一個指針。在linux的C語言中,除了用通用的《【C】文件讀寫問題》(點擊打開鏈)中介紹過的fopen等c語言通用操作文件以外,其Linux應用請參考《【Linux】利用C語言文件流復制單一文件),還能用文件標識符還來操作文件。這也是Linux中C語言,最底層,最原始控制文件的方式,其函數open,read,write,close已經完美地表明這一點。同時,在Linux無論是文件、設備和管道,甚至是個可操作對象對可以視作文件來對待,具體表現為都可以用這個文件標識符來操作他們。
文件標識符非常獨特,並不是指針,其變數類型就是大家非常常用的int。
至於這個東西怎麼用,具體請看如下文件讀寫程序:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//文件控制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXSIZE 512//緩沖區的大小
const char* FILEPATH="/tmp/file.txt";//文件目錄
int main(void) {
int fd;//文件標識符,
char *s = "被折騰的文字";
char buffer[MAXSIZE+1];//用來接字元的緩沖區
int size;//讀入的文件長度
if((fd=open(FILEPATH,O_CREAT|O_TRUNC|O_RDWR,0777))<0){
//O_CREAT如果指定文件不存在,則創建這個文件,O_EXCL如果要創建的文件已存在,則返回 -1,並且修改 errno 的值
//O_APPEND每次寫操作都寫入文件的末尾,O_TRUNC如果文件存在,並且以只寫/讀寫方式打開,則清空文件全部內容
//O_RDONLY只讀模式,O_WRONLY只寫模式,O_RDWR讀寫模式
//0777為最高許可權
perror("打開文件失敗!");
exit(1);
}
if((write(fd,s,strlen(s)))<0){
perror("寫入文件失敗!");
exit(1);
}
//lseek(fd,0,SEEK_SET);//即把文件指針移至buf文件的開始處
lseek(fd,-strlen(s),SEEK_END);//即把文件指針往從結尾處向前移動strlen(s)個字元
if((size=read(fd,buffer,MAXSIZE))<0){
perror("讀入文件失敗!");
exit(1);
}else{
buffer[size]='\0';//字元串數組封口
printf("%s\n",buffer);
}
if(close(fd)<0) {
perror("關鍵文件失敗!");
exit(1);
}
unlink(FILEPATH);//刪除文件
exit(0);
}
這個程序的一大堆頭文件,是沒辦法的,因為所用到的函數需要的基本頭文件就是這么多,但這些頭文件都是Linux的基本頭文件,能夠拿來直接用。
程序首先打開並同時利用open的參數創建一個文件,之後向這個文件,通過read函數寫入一個名為「緩沖區」buffer的字元數組,也就是字元串string的一些東西,然後,寫入完畢,因為文件操作游標將會移到文件最後,所以我們要先將其移迴文件頭,再利用write函數讀入這個文件的內容到buffer,並列印到屏幕,最後再用close關閉文件標識符與文件的連接,並利用unlink刪除這個文件,如果沒有close,unlink將不起作用,因為這個程序正在佔用這個/tmp/file.txt,無法刪除,如果要強制刪除可以考慮remove函數。
所以,上述代碼的運行結果如下圖:
最後,這個文件自然是要被刪除的了,肯定是沒有的:
上述程序很簡單,但我們更多應該關注這里文件標識符的作用。fd這個int就是文件標識符,相當於FILE *的作用,但他就是一個int。實質上,這個int非常獨特,同open函數,int fd裡面存著要被操作文件的地址,但它卻又不是int *,之後的write和read函數都要根據這個fd所指明的方向來,你可以發現write,read參數都有一個地方,填入了fd,可要求填入的,卻是一個int變數,這在windows裡面是沒有的,同時不了解文件標識符的人,看到write和read的使用可能是雲里霧里的,之後的close就更不用說了,就是清楚這個fd與被操作文件的關聯關系。
unlink函數則和文件標識符無關,需要一個文件路徑的參數。
⑵ linux c語言如何快速知道函數的頭文件
1、要用到unistd.h頭文件。
2、Write函數用法:write函數所在的頭文件為 <unistd.h>write有兩種用法。一種是:ssize_twrite(int handle, void *buf, int nbyte);handle 是文件描述符;buf是指定的緩沖區,即指針,指向一段內存單元;nbyte是要寫入文件指定的位元組數;返回值:寫入文檔的位元組數(成功);-1(出錯)write函數把buf中nbyte寫入文件描述符handle所指的文檔,成功時返回寫的位元組數,錯誤時返回-1.另一種是:write(const char* str,int n)str是字元指針或字元數組,用來存放一個字元串。n是int型數,它用來表示輸出顯示字元串中字元的個數。write("string",strlen("string");表示輸出字元串常量3、程序示例:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sysstat.h>
#include<io.h>
#include<string.h>
intmain(void)
{
int*handle;charstring[40];
intlength,res;/*Createafilenamed"TEST.$$$".If"TEST.$$$"alreadyexists,itwillbeoverwritten.*/
if((handle=open("TEST.$$$",O_WRONLY|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE))==-1)
{
printf("Erroropeningfile. ");
exit(1);
}
strcpy(string,"Hello,world! ");
length=strlen(string);
if((res=write(handle,string,length))!=length)
{
printf("Errorwritingtothefile. ");
exit(1);
}
printf("Wrote%dbytestothefile. ",res);
close(handle);return0;}
⑶ 用到strlen(函數,則應包含多少個頭文件)
只需要 #include <string.h>
拓展資料:
strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字元串開頭,中間某個位置,甚至是某個不確定的內存區域)開始掃描,直到碰到第一個字元串結束符'