1. 程式人生 > >Linux學習之檔案I/O操作

Linux學習之檔案I/O操作

Linux將所有的硬體裝置也當作檔案來處理,因此,檔案輸入輸出也是對裝置進行操作的基礎。檔案的IO有兩種:

(1) 非緩衝檔案操作:

           這種操作方式便於對較小規模的檔案的讀寫和對實施行要求很高的裝置的資料進行通訊,這類操作是系統呼叫提供的;並且系統只提供了兩個檔案操作的函式:read()和write()函式。使用的形式為:read(檔案識別符號,記憶體塊指標,記憶體塊長度);write(檔案識別符號,記憶體塊指標,記憶體塊長度);其中檔案識別符號可以是通過open函式開啟的檔案的識別符號,也可以是通過一下三種:

           0:標準輸入,即通過終端的輸入;

           1:標準輸出,即通過終端的輸出;

           2:標準錯誤,系統中存放錯誤資訊的堆疊。

示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#define LENGTH 2048

void main()
{
	char *fileName = "Test.txt";
	int f,i;
	char c[LENGTH];
	if((i=read(0, c, LENGTH)) < 1)
	{
		perror("read failed:");
		return ;
	}
	f = open(fileName, O_RDWR | O_CREAT, 0664);
	if(f!=-1)
	{
		if(write(f, c, i) != i)
			perror("Write failed:");
		puts("save file OK!");
		close(f);
	}
	else 
		perror("open file failed!");
	return ;
}

當然,還有一個函式比較中醫,就是lseek(檔案識別符號,偏移長度, 偏移的起始位置),其中偏移的起始位置可以為SEEK_SET(代表檔案的開始位置),SEEK_CUR(代表檔案指標的當前位置),SEEK_END(代表檔案的末尾位置)。具體用法不再詳述。

(2)緩衝檔案操作

         顧名思義,就是說一部分資料先放在緩衝區中,而當資料的長度要超過緩衝區的範圍時才先到物理裝置上去,這是通過呼叫C語言的庫函式來實現,因此是C中的標準,故一些實現的函式跟以前學過的一樣。標準輸入輸出庫中定義來檔案流結構指標FILE*來作為檔案的標識,並且同時提供來一系列的緩衝檔案操作函式,對應的有三個檔案流是系統定義的,分別是:

       stdin:標準輸入;

       stdout:標準輸出;

       dtderr:標準錯誤。

緩衝檔案操作函式:

       fopen(路徑,開啟方式);其中開啟方式為r或rb,w或wb,a或ab等等,沒有建立新檔案的功能。

       fread(緩衝區指標,長度,數量,檔案流指標);

       fwrite(緩衝區指標,長度,數量,檔案流指標);

示例程式碼:

char buf[SZIE];
FILE * fp = fopen("Test.txt", "r"); //以只讀方式開啟
fread(buf, LENGTH, SIZE/LENGTH, fp);//其中LENGTH為buf的長度,SIZE為緩衝區的長度,這樣就通過每次都讀取LENGTH長度,然後全部讀入buf中
fclose(fp);

fp = fopen("cope.txt", "rw+"); //以讀寫的方式開啟
fwrite(buf, LENGTH, SIZE/LENGTH, fp);//這樣就把資料寫入到檔案中了
fclose(fp);

下邊是檔案流的格式化輸入與輸出:

fscanf(檔案流指標,“控制字串”,輸出項列表);

fprintf(檔案流指標,“控制字串”,輸出項列表);

示例:

struct buddy
{
        char name[50];
        unsigned int tel;
        char address[200];
}

struct buddy bd;

if(create("buddy", 0664) == -1)
{
        perror("建立檔案錯誤!");
        return ;
}
FILE *fp;
fp = fopen("buddy", "rw+");
fprintf(fp, "<name>%s,<tel>%d,<address>%s","tom",12345,"China");
close(fp);

fp = fopen("buddy","rw+");
fscanf(fp, "<name>%s,<tel>%d,<address>%s",bd.name, &bd.tel, bd.address);
fclose(fp);

printf("<name>%s,<tel>%d,<address>%s",bd.name,&bd.tel,bd.address);

檔案流的定位操作:

fgetpos,fsetpos,Ftell,rewind等函式用於對檔案流進行定位操作。