C 文件操作

C语言中文件操作主要有以下函数:

  • fopen() :打开一个文件
  • fclose():关闭一个文件
  • fgetc():读取一个字符
  • fgets():读取多个字符
  • fputc():写入一个字符
  • fputs():写入多个字符
  • fread():二进制文件读取
  • fwrite():二制进文件写入
  • remove():删除文件
  • rename():重命令文件
  • access():判断文件是否存在

使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

FILE *fopen( const char * filename, const char * mode );

访问模式 mode 的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Note:计算机的文件存储在物理上都是二进制.文本文件和二进制之分,其实是一个逻辑之分.C读写文本文件与二进制文件的差别仅仅体现在回车换行符.写文本时,每遇到一个'\n',会将其转换成'\r\n'(回车换行);读文本时,每遇到一个'\r\n',会将其转换成'\n'.

综合实例,对一个文件进行拆分与合并:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>

#define LOG(level,format,...) printf("%s:"format,level,__VA_ARGS__)
#define LOGI(format,...) LOG("INFO",format,__VA_ARGS__)
#define LOGE(format,...) LOG("ERROR",format,__VA_ARGS__)

long getFileSize(char* filePath){
    FILE* file = fopen(filePath,"r");
    fseek(file,0,SEEK_END);
    long size = ftell(file);
    fclose(file);
    return size;
}

void separateFile(char* originFilePath,int file_num ){

    FILE* file = fopen(originFilePath,"rb");
    if (file == NULL){
        LOGE("file(path=%s) open failed \n", originFilePath);
        return;
    }
    long fileSize = getFileSize(originFilePath);

    char** separateFilesNames = malloc(sizeof(char*)*file_num);
    int i = 0;
    for (; i < file_num;i++){
        separateFilesNames[i] = malloc(sizeof(char)* 100);
        sprintf(separateFilesNames[i], "%s.piece%d", originFilePath,i);
        LOGI("generate file piece name:%s\n",separateFilesNames[i]);
    }
    int partSize = fileSize / file_num;

    if (fileSize%file_num == 0){
        for (i = 0; i < file_num; i++){
            FILE* fr = fopen(separateFilesNames[i],"wb");
            int j = 0;
            for (; j < partSize; j++)
            {
                fputc(fgetc(file),fr);
            }
            fclose(fr);
        }
    }
    else
    {
        int lastSize = fileSize - partSize*(file_num-1);
        for (i = 0; i < file_num - 1; i++){
            FILE* fr = fopen(separateFilesNames[i], "wb");
            int j = 0;
            for (; j < partSize; j++)
            {
                fputc(fgetc(file), fr);
            }
            fclose(fr);
        }
        FILE* fr = fopen(separateFilesNames[file_num-1], "wb");
        int j = 0;
        for (; j < lastSize; j++)
        {
            fputc(fgetc(file), fr);
        }
        fclose(fr);
    }

    fclose(file);
    i = 0;
    for (; i < file_num; i++){
        free(separateFilesNames[i]);
    }

    free(separateFilesNames);

}

void mergeFile(char* mergeFileName, int file_num){
    if (!_access(mergeFileName, 0)){//判断文件是否存在,不存在返回-1,即为真
        LOGI("merge file is exist \n");
        char newName[130];
        strcpy(newName, mergeFileName);
        strcat(newName, ".r.jpg");
        rename(mergeFileName, newName);
    }
    FILE* file = fopen(mergeFileName, "wb");
    char** separateFilesNames = malloc(sizeof(char*)*file_num);
    int i = 0;
    for (; i < file_num; i++){
        separateFilesNames[i] = malloc(sizeof(char)* 100);
        sprintf(separateFilesNames[i], "%s.piece%d", mergeFileName, i);
        LOGI("find file piece name:%s\n", separateFilesNames[i]);
    }
    int status = 0;
    for (i = 0; i < file_num; i++){
        FILE* fbr = fopen(separateFilesNames[i],"rb");
        if (fbr == NULL){
            LOGE("file(path=%s) open failed \n", mergeFileName);
            status = 1;
            break;
        }
        long size = getFileSize(separateFilesNames[i]);
        LOGI("handle file :%s,size =%ld\n", separateFilesNames[i],size);
        int j = 0;
        for (; j < size; j++)
        {
            fputc(fgetc(fbr),file);
        }
        fclose(fbr);
    }
    
    fclose(file);
    if (status){
        remove(mergeFileName);
    }
    i = 0;
    for (; i < file_num; i++){
        free(separateFilesNames[i]);
    }

    free(separateFilesNames);
}

void main(void){
    char* originFile = "G:\\Temp\\timg.jpg";
    int fileNum = 5;
    //separateFile(originFile, fileNum);
    //LOGI("separate file success!\n");

    mergeFile(originFile, fileNum);
    LOGI("merge file success!\n");
    system("pause");
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • [转]C/C++ 文件读写操作总结 在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以...
    天之道天知道阅读 5,199评论 0 7
  • c++文件操作详解 C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由o...
    鲍陈飞阅读 1,774评论 0 2
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,381评论 0 5
  • 亲爱的叔叔,虽然您早已去了天堂,但是在我心里您一直都存在着,时光抹去了您的容颜,抹去了您在这世界上的印迹,...
    紫轩逸晗墨阅读 252评论 0 0
  • 平水韵、平起首句押韵,和文友珠海潮平《老家的那盆茉莉》诗助兴。 白花映在绿丛边,犹似寒霜染鬓前。 遥念双亲多自艾,...
    原始生命阅读 1,121评论 35 114