文件编程简述

一、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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值