美文网首页
C语言文件操作案例

C语言文件操作案例

作者: 何亮hook_8285 | 来源:发表于2021-09-28 00:25 被阅读0次

基础文件操作

#include <errno.h>
#include <stdio.h>
#include <string.h>
    
//fopen 函数,参数1:文件路径,参数2:文件操作模式
// r 读取模式 w 写入模式 a 追加模式 r+ 具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容
// w+ 具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
// b 二进制
// a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
//打开文件
FILE file=fopen("1.txt","a");
//判断文件打开成功
if(file){
    printf("open success .");
    //获取错误码
    int err=ferror(file);
    //判断文件是否结束,0等于成功,否则失败
    int eof=feof(file);
    //关闭文件
    fclose(file);
}else{
    //打印错误码
    printf("%d\n",errno);
    //打印错误信息
    printf(strerror(errno));
    //打印错误信息
    perror("fopen");
}

//stdout 标准输出流
//stdin 标准输入流
//stderr 标准错误流

设置文件缓存区

缓存方式一

//打开文件
FILE file=fopen("1.txt","a");
//定义缓存区大小,BUFSIZ是系统定义的缓存大小宏。不能修改buf大小
char buf[BUFSIZ];
//设置缓存区
setbuf(file,buf);

缓存方式二

//打开文件
FILE file=fopen("1.txt","a");
//定义缓存区大小
char buf[8192];
//设置缓存区 
//IOFBF 全部缓存
//IOLBF 按行缓存
//IONBF 禁止缓存
//setvbuf 可以修改缓存大小
setvbuf(file,buf,IOLBF,8192);
//刷新缓存区
fflush(file);

单字符案例

读取单个字符

//读取一个字符
getchar();
//读取一个字符
getc(stdin);
//EOF 文件结束

while(1){
    int nextInput=getchar();
    if(nextInput == EOF){
        break;
    }else if(next_input == '\n'){
        continue;
    }
    
    printf("%c\n",nextInput);
}

写入单个字符

while(1){
    int nextInput=getchar();
    if(nextInput == EOF ){
        break;
    }else if(nextInput == '\n'){
        continue;
    }
    //写入字节
    putchar(nextInput);
}

读单个字符

FILE *file=fopen("1.txt","r");
if(file){
    int nextChar=getc(file);
    while(nextChar != EOF){
        //打印在控制台
        putchar(nextChar);
        nextChar=getc(file);
    }
    fflush(stdout);
    fclose(file);
}else{
    printf(strerror(errno));
    perror("fopen");
}

复制文件

int CopyFile(char const *src,char const *dest){
    FILE *srcFile=fopen(src,"r");
    if(!srcFile){
        return -1;
    }
    
    FILE *destFile=fopen(dest,"w");
    if(!destFile){
        fclose(srcFile);
        return -1;
    }
    
    int result;
    while(1){
        int nextInput=getchar(srcFile);
        if( nextInput == EOF){
            if(ferror(srcFile)){
                result=-1;
            }else if(feof(srcFile)){
                result=0;
            }else{
                return -1;
            }
            break;
        }
        
        if(fputc(nextInput,destFile) == EOF){
            result=0;
            break;
        }
    }
    flcose(srcFile);
    flcose(destFile);
    return result;
}

多字符案例

读取多字符函数

char buffer[1024];
gets_s(buffer,1024);
fgets(buffer,1024,stdin);
puts(buffer);
fputs(buffer,file);

案例1

void Echo(){
    char buffer[1024];
    while(1){
        if(!gets_s(buffer,1024)){
            break;
        }
        puts(buffer);
    }
}

案例2

void Echo(){
    char buffer[1024];
    while(1){
        if(!fgets(buffer,4,stdin)){
            break;
        }
        puts(buffer);
    }
}

复制文件

int CopyFile(char const *src,char const *dest){
    FILE *srcFile=fopen(src,"r");
    if(!srcFile){
        return -1;
    }
    
    FILE *destFile=fopen(dest,"w");
    if(!destFile){
        fclose(srcFile);
        return -1;
    }
    
    int result;
    char buffer[1024];
    char *next;
    while(1){
        next=fgets(buffer,1024,srcFile);
        if(!next){
            if(ferror(srcFile)){
                result=-1;
            }else if(feof(srcFile)){
                result=0;
            }else{
                result=-1;
            }
        }
        
        if(fputs(next,destFile) == EOF){
            result=-1;
        }
    }
    flcose(srcFile);
    flcose(destFile);
    return result;
}

二进制案例

//读文件
fread();
//写文件
fwrite();

案例1

void Echo(){
    char buffer[1024];
    while(1){
        size_t readLength=fread(buffer,sizeof(char),1024,stdin);
        if(readLength<1024){
            if(feof(stdin)){
                puts("EOF");
                fwrite(buffer,sizeof(char),readLength,stdout);
            }else if(ferror(stdin)){
                perror("error read form stdin ");
            }
            break;
        }
        
        fwrite(buffer,sizeof(char),readLength,stdout);
    }
}

案例2

void Echo(){
    int buffer[1024];
    while(1){
        size_t readLength=fread(buffer,sizeof(buffer[0]),1024,stdin);
        if(readLength<1024){
            if(feof(stdin)){
                puts("EOF");
                fwrite(buffer,sizeof(char),readLength,stdout);
            }else if(ferror(stdin)){
                perror("error read form stdin ");
            }
            break;
        }
        fwrite(buffer,sizeof(buffer[0]),readLength,stdout);
    }
}

文件重定向

python 123.py > out.log 2>&1

//将内容重定向1.txt
freopen("1.txt","a",stdout);
puts("hello world");
fclose(stdout);
#if defined(__APPLE__) || defined(__linux__)
#include <unistd.h>
#elif defined(_WIN32)
#include <io.h>
#endif

void RedirectStdout(char const *filename){
    static int saveStdoutNo=-1;
    if(filename){
        if(saveStdoutNo== -1){
            saveStdoutNo=dup(fileno(stdout));
        }
        fflush(stdout);
        freopen("1.txt","a",stdout);
    }else{
         if(saveStdoutNo != -1){
             fflush(stdout);
             dup2(saveStdoutNo,fileno(stdout));
             close(saveStdoutNo);
             saveStdoutNo=-1;
         }
    }
}

统计GBK和UTF-8字符数量

void CountInFile(char const *filename,int charset){
    
    FILE *file;
    switch(charset){
        case 0: //GBK
            #ifdef _WIN32
            setlocale(LC_ALL,"chs");
            #else
            setlocale(LC_ALL,"zh_CN.gbk");
            #endif
            file=fopen(filename,"r");
            break;
        case 1: //UTF-8
            setlocale(LC_ALL,"zh_CN.utf-8");
            #ifdef _WIN32
              file=fopen(filename,"r,ccs=utf-8");
            #else
            file=fopen(filename,"r");
            #endif
            break;
    }
    #define BUFFER_SIZE 512
    wchar_t wsc[BUFFER_SIZE];
    int count=0;
    while(fgetws(wsc,BUFFER_SIZE,file)){
        int c=wcslen(wsc);
        count+=c;
    }
    fclose(file);
}

输入和输出流的位置

FILE *file=fopen("1.txt","rb");
//获取当前读取位置
long pos=ftell(file);
char buffer[1024];
fread(buffer,1,1024,file);
//设置读取位置
//SEEK_SET 设置位置偏移
//SEEK_CUR 当前位置偏移
//SEEK_SEND 文件结尾位置偏移
fseek(file,10,SEEK_SET);
//fsetpos();
//fgetpos();
fclose(file);

格式化案例

FILE *fs=fopen("d:\1.txt","w");
fscanf(fs,"%s %s %d","zhangsan","nan",25);
fclose(fs);
FILE *fs=fopen("d:\1.txt","r");
char name[8];
char age[3];
int age;
fprint(fs,"%s %s %d",name,age,age);
fclose(fs);

其他常用文件操作

//删除文件
remove("d://1.txt");
//文件重命名
rename("d://1.txt","d://2.txt");
//创建临时文件
FILE *file=tmpfile();
//获取文件结构体对象
WinFile *win_file=(WinFile *)file;
//获取临时文件存储路径
puts(win_file->_tmpfname);
//关闭文件
fclose(file);
//获取文件大小
long GetFileSize(char const *filename){
    struct stat st;
    stat(filename,&st);
    return st.st_size;
}

//判断是不是目录
int IsDirectory(char const *filename){
    struct stat st;
    stat(filename,&st);
    return st.st_mode &S_IFDIR;
}

相关文章

  • C语言文件操作案例

    基础文件操作 设置文件缓存区 缓存方式一 缓存方式二 单字符案例 读取单个字符 写入单个字符 读单个字符 复制文件...

  • C语言文件输入和输出操作的学习心得(四)

    概述 C语言文件输入和输出操作的学习心得(一)C语言文件输入和输出操作的学习心得(二)C语言文件输入和输出操作的学...

  • C语言文件输入和输出操作的学习心得(三)

    概述 在C语言文件输入和输出操作的学习心得(二)已经详细介绍了C语言文件输入的操作,但未介绍如何读取文件的操作。本...

  • c语言文件操作

    在linux中我们知道一切皆文件,那么在c语言中文件操作有哪些呢,我们来看一下。 1.新建文件 定义文件类型指针变...

  • C语言文件操作

    一. 文件指针 1. 在C语言中,规定文件的结构体为FILE,FILE实际上是_iobuf的别名。 2. 定义一个...

  • C语言文件操作

    语言中对文件进行操作必须首先打开文件,打开文件主要涉及到fopen函数。fopen函数的原型为 FILE* fop...

  • C语言-文件操作

    C语言文件 C语言文件有两种类型:文本文件(也称ASCII码文件)和二进制文件。其差别在于存储数值型数据的方式不同...

  • C语言文件操作

    1.打开文件 2.操作文件 3.关闭文件 文件打开: fwrite写:fwrite(str, sizeof(cha...

  • c语言文件操作

    字符串模式指定为文件请求的访问类型,如下所示: “r” 打开以供读取。如果文件不存在或无法找到,则fopen调用失...

  • 2018-09-05

    c语言文件操作 文件操作流程:1.打开文件 2.操作文件 3.关闭文件 文件类型指针:File* fp; 文件打开...

网友评论

      本文标题:C语言文件操作案例

      本文链接:https://www.haomeiwen.com/subject/awklnltx.html