• C语言文件操作


    文件字符个数

    #include<stdio.h>
    #include<locale.h>
    #include<wchar.h>
    #include"../include/io_utils.h"
    
    #define ERROR_ILLEGAL_FILENAME -1
    #define ERROR_CANNOT_OPEN_FILE -2
    #define ERROR_READ_FILE -3
    #define ERROR_UNSUPPORTED_CHARSET -99
    
    #define CHARSET_UTF8 0
    #define CHARSET_GBK 1
    
    int CountCharactersInFile(const char*filename,int charset)
    {
        if(!filename)return ERROR_ILLEGAL_FILENAME;
        FILE*file;
        switch (charset)
        {
        case CHARSET_GBK:
    #ifdef _WIN32
        setlocale(LC_ALL,"chs");
    #else
        setlocale(LC_ALL,"zh_CN.gbk");
    #endif
        file = fopen(filename,"r");
        break;
        case CHARSET_UTF8: setlocale(LC_ALL,"zh_CN.utf-8");
    #ifdef _WIN32
        file = fopen(filename,"r,ccs=utf-8");
    #else
        file = fopen(filename,"r");
    #endif
        break;
        default: return ERROR_UNSUPPORTED_CHARSET;
        }
        if(!file)return ERROR_CANNOT_OPEN_FILE;
        wchar_t wcs[BUFSIZ];
        int count = 0;
        while(fgetws(wcs,BUFSIZ,file))
        {
            count+=wcslen(wcs);
        }
        if(ferror(file))
        {
            perror("CountCharactersInFile error");
            fclose(file);
            return ERROR_READ_FILE;
        }
        fclose(file);
        return count;
    }
    
    int main()
    {
        PRINT_INT(CountCharactersInFile("filelist.txt",0));
        
        return 0;
    }
    

    重定向标准输入输出

    #include<stdio.h>
    
    #if defined(__APPLE__) || defined(__linux__) 
    #include<unistd.h>
    #elif defined(_WIN32)
    #include<io.h>
    #endif
    
    void RedirectStdout(const char* filename)
    {
        static int saved_stdout_no = -1;
        if(filename){
            if(saved_stdout_no == -1){
                saved_stdout_no = dup(fileno(stdout));
            }
            freopen(filename,"a",stdout);
        }else{
            if(saved_stdout_no !=-1){
                dup2(saved_stdout_no,fileno(stdout));
                close(saved_stdout_no);
            }
        }
    }
    
    int main()
    {
    
        puts("1");
        RedirectStdout("output.log");
        puts("2");
        RedirectStdout(NULL);
        puts("3");
        return 0;
    }
    

    序列化和反序列化

    #include<stdio.h>
    #include<time.h>
    #include"../include/io_utils.h"
    #include"../include/time_utils.h"
    
    #define ERROR 0
    #define OK 1
    
    typedef struct 
    {
        int vilibility;
        int allow_notification;
        int refresh_rate;
        int region;
        int font_size;
    }Setting;
    
    void PrintSetting(Setting*setting)
    {
        PRINT_INT(setting->vilibility);
        PRINT_INT(setting->allow_notification);
        PRINT_INT(setting->refresh_rate);
        PRINT_INT(setting->region);
        PRINT_INT(setting->font_size);
    }
    int SaveSetting(Setting*setting,const char* setting_file)
    {
        FILE*file = fopen(setting_file,"wb");
        if(!file){
            perror("Failed to save setting");
            return ERROR;
        }else{
            fwrite(setting,sizeof(Setting),1,file);
            fclose(file);
            return OK;
        }
    }
    
    int LoadSetting(Setting*setting,const char* setting_file)
    {
        FILE*file = fopen(setting_file,"rb");
        if(!file){
            perror("Failed to load setting");
            return ERROR;
        }else{
            fread(setting,sizeof(Setting),1,file);
            fclose(file);
            return OK; 
        }
    }
    
    int main()
    {   
        Setting setting;
        LoadSetting(&setting,"setting.txt");
        PrintSetting(&setting);
        setting.font_size = 10000;
        SaveSetting(&setting,"setting.txt");
        
        return 0; 
    }
    

    读取指定数目

    #include<stdio.h>
    #include"../include/io_utils.h"
    #include"../include/time_utils.h"
    
    #define BUFF_SIZE 4
    int main()
    {   
        int buff[BUFF_SIZE];
        while(1)
        {
            size_t bytes_read = fread(buff,sizeof(buff[0]),BUFF_SIZE,stdin);
            if(bytes_read<BUFF_SIZE){
                if(feof(stdin)){
                    puts("EOF");
                    fwrite(buff,sizeof(char),bytes_read,stdout);
                }else if(ferror(stdout)){
                    perror("Error read from stdin");
                }
                break;
            }
            fwrite(buff,sizeof(buff[0]),BUFF_SIZE,stdout);
        }
    
        return 0; 
    }
    

    输入读取

    #include<stdio.h>
    #include"../include/io_utils.h"
    #include"../include/time_utils.h"
    
    
    int main()
    {
        char buff[4];
        while (1)
        {
            if(!fgets(buff,4,stdin))
            {
                break;
            }
            printf_s("s",buff);
        }
        
    
        return 0; 
    }
    

    文件复制

    #include<stdio.h>
    #include<time.h>
    #include"../include/io_utils.h"
    #include"../include/time_utils.h"
    
    int CopyFile(const char* src,const char* dest)
    {
        if(!src || !dest)
        {
            return -1;
        }
        FILE*src_file = fopen(src,"r");
        if(!src_file)
        {
            fclose(src_file);
            return -2;
        }
        FILE*dest_file = fopen(dest,"w");
        if(!dest_file)
        {
            fclose(dest_file);
            return -2;
        }
        int result = 0;
        while(1)
        {
            int next = fgetc(src_file);
            if(next == EOF)
            {
                if(ferror(src_file)){
                    result = -3;
                }else if(feof(src_file)){
                    result = -1;
                }else{
                    result = -2;
                }
                break;
            }
            if(fputc(next,dest_file) == EOF)
            {
                result = -4;
                break;
            }   
        }
        fclose(src_file);
        fclose(dest_file);
        return result;
    }
    int main()
    {
       CopyFile("../include/io_utils.h","io_utils.h");
    
        return 0; 
    }
    
  • 相关阅读:
    Scrum会议5
    小组项目alpha发布的评价
    第二阶段冲刺记录三
    第二阶段冲刺记录二
    第13周学习进度
    第二阶段冲刺记录1
    《人月神话》阅读笔记01
    第12周学习进度
    意见汇总
    双人结对,四则运算(三阶段)
  • 原文地址:https://www.cnblogs.com/chengmf/p/14946143.html
Copyright © 2020-2023  润新知