文件编程简述
来源:互联网 发布:淘宝禁售拉卡拉 编辑:程序博客网 时间: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
- 文件编程简述
- TWebBrowser 编程简述
- TWebBrowser编程简述
- 简述并行编程
- TWebBrowser编程简述
- TWebBrowser编程简述
- TWebBrowser编程简述
- C#多线程编程简述
- C#多线程编程简述
- C#多线程编程简述
- C#多线程编程简述
- 简述DLL编程
- Hadoop编程接口简述
- OPENLDAP API 编程简述
- java动态编程简述
- PHP异步编程简述
- C#多线程编程简述
- Qt5 编程简述
- nyoj10_skiing
- poll机制
- 【mybatis】IF判断的坑 (实现<if test=" status == 'zhangsan'">)
- ssm整合
- 写点什么
- 文件编程简述
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
- SQL语句order by两个字段同时排序。
- Android编译版本eng、user和userdebug的区别
- XML的解析
- 运维笔记20 (mariaDB的基础语句)
- ORA-00031: session marked for kill 处理Oracle中杀不掉的锁
- Caused by: android.system.ErrnoException: isConnected failed: EHOSTUNREACH (No route to host)
- 第十四章