文件操作之相关练习

示例1:向test.txt文件中写入数据
test.txt(假设已存在的test.txt的文件内容为123456789)
在这里插入图片描述
file1.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main()
{
     int fd;         //描述符
     char filename[]="test.txt";
     //如果文件存在
     if(access(filename,F_OK) == 0)
     {
         printf("[%s] is already exits !\n",filename);
         //删除文件(即把当前存在的文件删除重写)
         unlink(filename);
     }
     //设置文件权限掩码
     umask(0);
     //创建文件
     fd = open(filename,O_RDWR | O_CREAT,0777);
	 //如果打开文件失败
     if(fd < 0)
     {
         printf("open file:%s,error:%s\n",filename,strerror(errno));
         return -1;
     }
     //设置文件偏移,从文件尾开始
     lseek(fd,0,SEEK_END);
     //缓冲区内数据为ABCDEFG
     char buffer[1024]="ABCDEFG";
     //写数据,将缓冲区内的数据全部一次性写入
     int w_len = write(fd,buffer,strlen(buffer));
     printf("write len=%d\n",w_len);
     //设置文件的偏移量为0,即文件的开始位置
     lseek(fd,0,SEEK_SET);
 
  //读数据
  char readbuffer[1024]={0};
  int nSize = read(fd,readbuffer,1024);
  printf("%s\n",readbuffer);
  struct stat st;
 
     if(fstat(fd,&st) < 0)
     {
         perror("get stat error !\n");
         return -1;
     }
     printf("%s‘s size=%d\n",filename,st.st_size);
 
     //改变文件大小
     ftruncate(fd,7);
 
     //关闭文件
     close(fd);
 
     return 0;
}

编译并运行:gcc file1.c -o file1

之后再查看test.txt文件,发现内容已经改变。

示例2:复制文件(把b.txt文件内容复制到a.txt中)
b.txt

copyfile2.c

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>	
#include <errno.h>

int main()
{
    const char *pathname = "a.txt";
    //文件描述符
    int fdin;
    int fdout;
    int size;
    char buffer[1024]={0};
    //S_IRUSR=0400,权限为用户只读
    fdin = open("b.txt",O_RDONLY,S_IRUSR);
    if(-1 == fdin)
    {
        perror("Open file failed !\n");
        return -1;
    }
    //创建文件a.txt,权限为用户可读可写可执行
    fdout = creat(pathname,S_IRWXU);
    if(-1 == fdout)
    {
        perror("Create file failed !\n");
        return -1;
    }
    //读文件b.txt
    size=read(fdin,buffer,1024);
    if(size > 0)
    {
        //写文件a.txt
        write(fdout,buffer,size);
        printf("%s",buffer);
    }
    close(fdout);
    close(fdin);
    return 0;                                   
}

编译并运行:gcc copyfile2.c -o copyfile2
在这里插入图片描述
在这里插入图片描述

示例3:测试文件类型(目录文件、普通文件、设备文件等)
file3.c

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<dirent.h>
int main()
{
    DIR *p_dir=NULL;
    char filename[]="File_test";
    //测试目录是否存在
    //如果目录不存在则创建
    if(access(filename,F_OK) != 0)
    {   
        printf("文件不存在 !\n");
        mkdir(filename);
    }
    //打开目录
    p_dir=opendir(filename);
    if(NULL==p_dir)
    {   
        perror("创建目录失败!\n");
        return -1;
    }
    struct dirent *p_dirent=NULL;
    while((p_dirent=readdir(p_dir))!=NULL)
    {   
        if(!(strcmp(p_dirent->d_name,".") || strcmp(p_dirent->d_name,"..")))
        {   
            continue;
        }
        if(p_dirent->d_type==DT_DIR)
        {   
            printf("%s是目录文件!\n",p_dirent->d_name);
        }
        else if(p_dirent->d_type==DT_REG)
        {   
            printf("%s是规则文件!\n",p_dirent->d_name);
        }
        else
        {
            printf("%s是其他文件!\n",p_dirent->d_name);
        }
    }

    closedir(p_dir);
    return 0;
}  

编译并测试运行:gcc file3.c -o file3
在这里插入图片描述

示例4:打印目录
打印当前目录下的各个文件名
file4.c

#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/stat.h>
void printdir(char* dir,int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    if((dp=opendir(dir))==NULL)
    {
        fprintf(stderr,"cannot open dir:%s\n",dir);
        return;
    }
    //切换到dir目录
    chdir(dir);
    while((entry=readdir(dp))!=NULL)
    {
        lstat(entry->d_name,&statbuf);
        //如果是目录
        if(S_ISDIR(statbuf.st_mode))
        {
            if(!strcmp(entry->d_name,".")||!strcmp(entry->d_name,".."))
            {
                continue;
            }
            printf("%*s%s\n",depth,"",entry->d_name);

            //递归调用
            printdir(entry->d_name,depth+4);
        }
        else
        {
            printf("%*s%s\n",depth,"",entry->d_name);
        }
    }

    chdir("..");
    closedir(dp);
}
int main()
{
     printf("目录扫描......\n");
     //当前目录
     printdir("/home/jx/UFE/Class5",0);
     printf("Done......\n");
     return 0;
}

编译并运行:gcc file4.c -o file4
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值