文件编程简述

来源:互联网 发布:淘宝禁售拉卡拉 编辑:程序博客网 时间:2024/06/05 05:26

一、Linux下的文件系统
1.1 文件系统概述:操作系统在磁盘或分区上用来存储和管理文件的子系统。
作用:向用户提供了对底层硬件数据访问的机制。
Linux可以支持多文件系统是通过虚拟文件系统(Virtual File System)VFS来实现的。VFS只存在于系统的内存中,在系统启动调入内存,系统关闭调出内存。

1.2 文件和目录特性
在Linux下所有的软件和硬件都被称为文件。
文件分为5种:普通文件、目录文件、链接文件、设备文件和管道文件。

1.3 VFS基本数据结构
超级块结构(struct super_block):存放已安装的的文件系统的相关信息。
索引点结构(struct inode):存放有关具体文件的一般信息。
文件结构(struct file):存放进程中打开的文件相关信息。
目录项结构(struct dentry):存放有关路径名及路径名所指向的文件的信息。

二、标准文件操作
C语言提供的文件描述符的概念,通过文件描述符与底层文件相关联,个函数通过文件描述符来对文件进行操作。
1.1 底层文件操作函数
1、open()函数
函数原型:int open(const char *pathname,int flags,mode_t mode);
返回值:打开文件成功,返回唯一的文件描述符(read()和write()函数通过文件描述符对文件进行操作);打开失败,返回-1原因记录在全局变量errno中。
(只有选择flags参数的O_CREAT,参数mode才有效)
2、close()函数
函数原型:int close(int fd);
函数说明:关闭文件描述符fd指定的文件,将数据写回磁盘,并释放该文件所占的内存资源。成功返回0,失败返回-1。
错误代码:EBADF,表示参数fd不是有效的文件描述符,或该文件已关闭
3、read()函数
函数原型:size_t read(int fd, void *buf, size_t count);
返回值:函数成功,返回实际读取的字节数;若返回0,说明表示到达文件尾或没有字符可读取;返回值小于count,其他原因。
错误代码:
4、write()函数
函数原型:size_t write(int fd, const void *buf, size_t count);
返回值:成功,返回写入的字节数,(0代表没有写入数据);失败,返回-1,原因记录在errno变量中。
错误代码:
5、ioctl()函数
头文件:#include

#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>void main(){    int fd,size;    char s[]="This is a linux programe!\n",buffer[50];    fd=open("temp.txt",O_WRONLY|O_CREAT|O_EXCL);    write(fd,s,sizeof(s));    close(fd);    fd=open("temp.txt",O_RDONLY);    size=read(fd,buffer,sizeof(buffer));    close(fd);    printf("%s",buffer);}

二、标准文件操作函数
1、文件打开与关闭函数
1).fopen()函数
函数原型:FILE *fopen(const char *path, const char *mode);
函数说明:fopen()函数以mode方式打开参数path指向的文件。
mode打开方式:r r+ w w+ a a+.

#include<stdio.h>int main(){    FILE *fp;    fp=fopen("temp.txt","a+");    if(fp == NULL)        return 0;    else        printf("open file succeeded!\n");    fclose(fp);}

2).fclose()函数
函数原型:int fclose(FILE *stream);
返回值:成功返回0;否则返回EOF,错误记录在全局变量errno中。
错误代码EBADF,表示参数stream不指向已打开的文件。
2.文件的读写函数
1)、fread()函数
函数原型:size_t fread(void *ptr , size_t size, size_t nmemb,FILE *stream);
返回值: 成功返回读取单元个数;若指针到达文件尾,返回一个小于nmemb的数;失败返回0。
2)、fwrite()函数
函数原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
返回值: 成功返回读取单元个数;若指针到达文件尾,返回一个小于nmemb的数;失败返回0。

#include<stdio.h>void main(void){    FILE *ptr;    int i, numread, numwritten, length;    length=20;    char data[length];    if((ptr = fopen("test.txt", "w+"))!=NULL)    {        for(i=0; i<length; i++)            data[i]='a'+i;        numwritten = fwrite(data, sizeof(char), length,ptr);        printf("Wrote %d words\n", numwritten);        fclose(ptr);    }    else        printf("Open file failed!\n");    if((ptr = fopen("test.txt", "r+"))!=NULL)    {        numread=fread(data,sizeof(char),length,ptr);        printf("%s\n",data);        printf("read %d words\n",numread);        fclose(ptr);    }    else        printf("can't open the file!\n");}

3、 读写文件字符函数
1)fgetc()函数
函数原型:int getc(FILE *stream);
函数说明:fgetc()函数从参数stream所指向的文件中读取一个字符。
返回值:成功返回读取的字符;若达到文件尾,则读取失败,返回EOF。
2)、fputc()函数
函数原型:int fputc(int c,FILE *stream);
函数说明:fputc()函数将字符c转为unsigned char 后写入参数stream指向的文件。
返回值:成功返回读取的字符,失败返回EOF。
3)fgets()函数
函数原型:char *fgets(char *s, int size, FILE *stream);
返回值:成功返回指针s;错误返回NULL。
4)fputs()函数
函数原型:int fputs(const char *s,FILE *stream);
函数说明:将参数s指向的字符串写入参数stream指向的文件中,’\0’不写入。
返回值:成功返回写入文件的字符个数;否则返回EOF。
1)remove()函数
函数原型:int remove(const char *pathname);
返回值:成功返回0;失败返回-1,错误代码放在errno中。
错误代码:
2)rename()函数
函数原型:int rename(const char *oldpath,const char *newpath);
返回值:成功返回0;失败返回-1,错误代码放在errno中。
错误代码:

#include<stdio.h>int main(){    int flag;    char old[]="temp.txt";    char new[]="/root/sxy/new.txt";    flag=rename(old,new);    if(flag==0)        printf("succeed\n");    else        printf("failed\n");}

5、access()函数
函数原型:int access(const char *pathname, int mode);
函数说明;检查进程是否有读写权限,参数mode的F_OK判断文件是否存在。

三、目录操作
1.目录数据结构
struct dirent
{
ino_ t d_ino; //索引节点
ff_t d_off; //目录文件开头到此目录进入点的位移
signed short int d_reclent; //目录项名称长度
unsigned char d_type; //所指文件的类型
char d_name[256]; //文件名
}
2、目录文件的创建mkdir()函数
函数原型:int mkdir(const char *pathname,mode_t mode);
函数说明:函数以mode方式创建一个参数pathname命名的目录,mode定义新创建的目录的权限。
返回值:成功返回0;失败返回-1,错误代码放在errno中。
错误代码:
3、目录删除函数rmdir()
函数原型:int rmdir(const char *pathname);
函数说明:用来删除一个目录,该目录必须为空。
返回值:成功返回0;失败返回-1,错误代码放在errno中。
错误代码:

#include<stdio.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>int main(){    int sign;    char pathname[]="root/syx/temp";    sign=mkdir(pathname,O_RDWR);    if(sign==0)        printf("craete succeed!\n");    else        printf("craete failed!\n");    sign=rmdir(pathname);    if(sign==0)        printf("delete succeed!\n");    else        printf("delete failed\n");    return 1;}
4、目录打开函数opendir()        函数原型:DIR *opendir(const char *name);        函数说明:打开参数name指向的目录,参数name指向该目录的入口地址。        返回值:打开成功,返回一个指向目录流的指针;否则返回NULL。        错误代码:5、目录文件读取函数readdir()        函数原型:struct dirent *readdir(DIR *dir);        函数说明:返回一个结构体dirent型的指针,该指针指向下一个目录的入口地址。        返回值:成功返回一个结构体dirent型的指针;错误或指向文件尾,返回NULL。        错误代码:EBADF,说明dir是一个无效的目录流。6、目录关闭函数closedir()        函数原型:int closedir(DIR *dir);        返回值:成功返回0;否则返回-1。        错误代码:EBADF,说明dir是一个无效的目录流。

include

include

include

7、目录属性设置函数chmod()        函数原型:int chmod(const char *path,mode_t mode);        函数说明:以mode方式改变参数path指向文件的权限。        返回值:成功返回0;失败返回-1,错误代码放在errno中。        错误代码:8、目录属性读取函数getcwd()        函数原型:char *getcwd(char *buf,size_t size);        函数说明:将当前工作目录的绝对路径存储到字符数组buf所在的内存中,数组长度为size。        返回值:成功返回buf的指针;否则返回NULL。        错误代码:

include

include

0 0
原创粉丝点击