檔案管理I/O筆記

wzm10455發表於2013-01-14

1.檔案一共有六中型別:

連結檔案l,普通檔案-,裝置檔案(字元檔案和塊檔案),管道檔案p,套接字檔案,目錄檔案

2.檔案的一些函式的基本的使

檔案的開啟許可權,基本上是0666,更具w對應為2,r對應為4,x對應為1

幾個函式:

creat("./helo",0666)//

chdir("/tmp");//修改檔案的主目錄,這樣檔案的位置就不是在當前位置了,在其它檔案下建立可能儲蓄哦

perror(fd);//顯示上一個出錯的函式,本身就帶著:

3.寫入出錯時,很可能就是檔案的許可權的問題

注意點:如果又想建立,又想檔案的讀寫,則最好用open 函式

open(開啟檔案)
相關函式
read,write,fcntl,close,link,stat,umask,unlink,fopen
表標頭檔案
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>
定義函式
int open( const char * pathname, int flags);int open( const char * pathname,int flags, mode_t mode);
lseek:

lseek(移動檔案的讀寫位置)
相關函式
dup,open,fseek
表標頭檔案
#include<sys/types.h>#include<unistd.h>
定義函式
off_t lseek(int fildes,off_t offset ,int whence);
函式說明
每一個已開啟的檔案都有一個讀寫位置,當開啟檔案時通常其讀寫位置是指向檔案開頭,若是以附加的方式開啟檔案(如O_APPEND),則讀寫位置會指向檔案尾。當read()或write()時,讀寫位置會隨之增加,lseek()便是用來控制該檔案的讀寫位置。引數fildes 為已開啟的檔案描述詞,引數offset 為根據引數whence來移動讀寫位置的位移數。
引數
whence為下列其中一種:SEEK_SET 引數offset即為新的讀寫位置。SEEK_CUR 以目前的讀寫位置往後增加offset個位移量。SEEK_END 將讀寫位置指向檔案尾後再增加offset個位移量。當whence 值為SEEK_CUR 或SEEK_END時,引數offet允許負值的出現。下列是教特別的使用方式:1) 欲將讀寫位置移到檔案開頭時:lseek(int fildes,0,SEEK_SET);2) 欲將讀寫位置移到檔案尾時:lseek(int fildes,0,SEEK_END);3) 想要取得目前檔案位置時:lseek(int fildes,0,SEEK_CUR);
返回值
當呼叫成功時則返回目前的讀寫位置,也就是距離檔案開頭多少個位元組。若有錯誤則返回-1,errno 會存放錯誤程式碼。
附加說明
Linux系統不允許lseek()對tty裝置作用,此項動作會令lseek()返回ESPIPE。

#include<sys/types.h>//是Unix/Linux系統的基本系統資料型別的標頭檔案,含有size_t,time_t,pid_t等型別。
#include<sys/stat.h>//獲取一些檔案相關的資訊
#include<fcntl.h>//這個是為了使用fcntl.h定義了很多巨集和open,fcntl函式原型
#include<stdio.h>
#include<errno.h>//用strerror(error)

int main()
{
	int fd;
       //11
        umask(0);//填充0表示獎mask 程式設計0,只使用程式中的這個值,不需要減去系統中的值
	fd=creat("./helo",0666);
	if(fd==-1)
	{
		perror("create error");
		return -1;
	}
	printf("%d",fd);
	int i;
	for(i=0;i<10;i++)
	{
		printf("第%d :%s\n",i,strerror(i));//這時候要用:
	}
	int fd;

        //22
        fd=open("./helo.txt",O_RDONLY|O_CREAT,0666|O_RDWR);//不存在就建立檔案
	if(-1==fd)
	{

              //33 
                printf("%s",strerror(errno));//這時候要用:printf
		perror("open error");//根據上一個呼叫的函式t,後面不要加冒號
		return -1;
	}
   printf("%d",fd);//這裡檔案fd為檔案描述符,輸出到標準輸出裡面去,不是輸出到螢幕上
   close(fd);
	return 0;
}



//檔案讀寫


#include<fcntl.h>
#include<stdio.h>
#include<errno.h>//用strerror(error)

#include<unistd.h>
int main()
{
    int fd;
    fd=open("helo",O_RDWR|O_CREAT,0666);
    if(fd==-1)
    {
        perror("create error");
        return -1;
    }
    char buf[10]="hell0";
    int a=write(fd,buf,strlen(buf));
    if(-1==a)
    {
        perror("write error");
        return -1;
    }
    printf("%d\n",a);
    lseek(fd,0,SEEK_SET);
    //    lseek(fd,-12,SEEK_CUR);//當前位置前12個
    int b=read(fd,buf,10);//位置胡相後
    if(-1==b)
    {
        perror("read error");
        return -1;
    }
    printf("%d",b);
    buf[a]='\0';
    printf("buf:%s",buf);

    return 0;
}


4.記憶體空間的劃分:

堆:從malloc()分配的記憶體,程式由os分配,沒回收會導致程式洩露,free()可以用來回收

棧:區域性變數放在棧上。當一個函式返回時,所有的棧空間被收回

常量區:不允許被修改,入“helloworld”,當程式退出時被釋放,所以期間時一直存在的

程式碼區:也不能被修改

全域性區:全域性初始化區和未初始化區

            int t=1;                  int t;預設為0

靜態儲存區:和全域性區相連 static宣告的變數,裡面的值也預設為0

#include <stdio.h>
#include <stdlib.h>
char *func()
{
    char *s="hello";//
    return s;
}
char *fun2()
{
    char p[]="為為為為為";//而這個時存在棧空間的,呼叫結束函式返回時,裡面陣列所有的空間被釋放調,但是地址是還在的,只是裡面沒樹了
    return p;
}
int main(void) {
    char *s=NULL;
    char *q=NULL;
    s=func();//hello的首地址
    q=fun2();//結果是亂碼或者是出現斷錯誤
    printf("%s\n",s);
    printf("%s\n",q);
    //puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    return EXIT_SUCCESS;
}

檢驗檔案是否可讀:


    int ret=access(argv[1],R_OK|F_OK);
    if(ret==-1)
    {
        perror("access");
    }
    else
    {
        printf("[%s] exist and executeable",argv[1]);
    }
    if(fd1==-1)
    {
        perror("source file wrong");
        return -1;
    }

相關文章