2. C语言文件操作经典习题

1. 统计英文文本文件中,有多少个大写字母、小写字母、数字、空格、换行以及其他字符。

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

void main()
{
    char path[100] = "c:\\统计.txt";
    FILE *fp;                 //创建文件指针
    fp = fopen(path, "r");    //打开文件,按照读的模式

    if (fp == NULL)
    {
        printf("文件打开失败!\n");
        return;
    }
    else
    {
        char ch;
        int countBig = 0;      //统计大写字母的个数
        int countSmall = 0;    //统计小写字母的个数
        int contNum = 0;       //统计数字的个数
        int countEnter = 0;    //统计换行的个数
        int countSpace = 0;    //统计空格的个数
        int countOther = 0;    //统计其他字符的个数

        while ((ch = fgetc(fp)) != EOF)       //获取一个字符,没有结束就继续
        {
            if (ch >= ‘A‘&&ch <= ‘Z‘)         //判断是否大写字母
                countBig++;
            else if (ch >= ‘a‘&&ch <= ‘z‘)    //判断是否小写字母
                countSmall++;
            else if (ch >= ‘0‘&&ch <= ‘9‘)    //判断是否数字
                contNum++;
            else if (ch == ‘\n‘)              //判断是否换行
                countEnter++;
            else if (ch == ‘ ‘)               //判断是否空格
                countSpace++;
            else                              //其他字符
                countOther++;
        }

        printf("大写字母:%d,  小写字母:%d,  数字:%d,  换行:%d,  空格:%d,  其他:%d\n", countBig, countSmall, contNum, countEnter, countSpace, countOther);
    }

    fclose(fp);
    system("pause");
}

2. 编程实现搜索文件

  Windows下:

  遍历所有c盘下所有 *.txt *.exe   dir.* :

    for /r c:\ %i in (*.txt) do @echo %i

  在c盘下搜索所有文件内容包含 hello 的文件:

    for /r c:\ %a in (*) do @findstr /im "hello" "%a"

  Linux下:(搜索时进入管理员权限)

  指定目录搜索----确定文件名:

    find /etc -name 1.c

  搜索文件名中带c的文件:

    find / -name *c*

  从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含“ERROR” 的行:

    find / -type f -name "*.log" | xargs grep "ERROR"

  Windows下代码如下:

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

void main()
{
    /*按文件名进行搜索*/
    //char path[100] = "C:\\Users\\Administrator\\Desktop";                //搜索用的目录
    ////搜索文件名用的通配符 *.txt表示所有文本文件
    ////1.*表示1开头的所有文件,*.*表示所有文件
    //char fileName[30] = "*.txt";
    //char outputPath[100] = "c:\\";            //保存输出结果的文件
    //char cmd[512];
    ////for /r "%s" %i in (%s) do @echo %i >> "%s",path, fileName, outputPath
    //sprintf(cmd, "for /r \"%s\" %%i in (%s) do @echo %%i >> \"%s\"", path, fileName, outputPath);    //打印字符串
    //system(cmd);                            //执行查找,并将结果输入到outputPath这个文件

    //char showCmd[200];
    //sprintf(showCmd, "type %s", outputPath);//打印字符串,便于查看
    //system(showCmd);                        //显示

    /*按文件内容进行搜索*/
    char path[100] = "C:\\Users\\Administrator\\Desktop";
    char str[20] = "hello";
    char cmd[500];
    char output[100] = "C:\\Users\\Administrator\\Desktop\\output.txt";    //保存输出结果的文件
    //创建一个指令字符串,按照一段文本,在一个目录下检索所有包含了这段文本的文件
    sprintf(cmd, "for /r %s %%a in (*) do @findstr /im \"%s\" \"%%a\" >> %s", path, str, output);
    system(cmd);    //执行指令 

    char showCmd[200];
    sprintf(showCmd, "type %s", output);//打印字符串,便于查看
    system(showCmd);                    //显示

    system("pause");
}

  Linux下代码如下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    /*按文件名进行搜索*/
    //char str[20] = "*c*";
    //char path[100] = "/home";
    //char output[100] = "/home/output.txt";
    //char cmd[100];
    //sprintf(cmd, "find %s -name \‘%s\‘ >> %s", path, str,output);
    //ystem(cmd);

    //char show[100];
    //sprintf(show, "cat %s", output);
    //system(show);

    /*按文件内容进行搜索*/
    char path[100] = "/home";
    char str[20] = "hello";
    char findName[20] = "*.c";
    char output[100] = "/home/output.txt";
    char cmd[100];
    char show[100];
    sprintf(cmd, "find %s -type f -name \"%s\" |  xargs grep %s >> %s", path, findName, str,output);
    system(cmd);

    sprintf(show, "cat %s", output);
    system(show);
}

3. 统计文本文件中有多少个汉字。

  GBK(汉字编码标准)规定,汉字,日文,韩文第一个字节大于128

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

void main()
{
    FILE *fp;                            //空的文件指针
    char path[100] = "c:\\1.txt";        //文件路径
    fp = fopen(path, "r");               //读的方式打开文件

    if (fp == NULL)
        perror("文件打开失败原因是:");      //输出错误原因

    int ich;                   //获取字符,fgetc的返回值是int,不用int,ASCII码没有问题,但是汉字会出问题
    //int占4个字节,用int才能存储汉字的编码,而char装不下
    int countEng=0;            //标记英文字符
    int countNum=0;            //标记数字
    int countChin=0;           //标记汉字

    while ((ich = fgetc(fp)) != EOF)
    {
        if ((ich >= ‘A‘&&ich <= ‘Z‘) || (ich >= ‘a‘&&ich <= ‘z‘))
            countEng++;        //字母自增
        else if (ich >= ‘0‘&&ich <= ‘9‘)
            countNum++;        //数字自增
        else if (ich > 128)    //判断双字节字符
        {
            //此处仅得到了双字节,还需要增加判断汉字的代码(GBK编码规范)。。。此处省略
            ich = fgetc(fp);   //继续向前读一个字符
            countChin++;       //双字符自增
        }
    }

    printf("英文字符%d,  数字%d,  双字节字符%d\n", countEng, countNum, countChin);

    fclose(fp);
    system("pause");
}

4. 文件加密和解密。

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

//1.txt加密后保存到1-Encrypt.txt;解密以后保存到1-Decrypt.txt
//加密最好按照二进制的方式加密,可以保证绝对精确
//文本的方式,换行符会被解析为/r/n,往往容易出现问题
//加密
void Encrypt(int passwd)
{
    FILE *fpr;    //读取1.txt
    FILE *fpw;    //写入1-Encrypt.txt
    char pathr[100] = "c:\\1.txt";
    char pathw[100] = "c:\\1-Encrypt.txt";

    fpr = fopen(pathr, "r");    //读的模式打开需要加密的文件
    fpw = fopen(pathw, "w");    //写的模式打开要写入的加密文件

    if (fpr == NULL || fpw == NULL)
    {
        printf("文件故障,加密失败!\n");
        return;
    }

    while (!feof(fpr))            //一直读到要加密的文件末尾
    {
        char ch = fgetc(fpr);    //读取文本

        /*字符移位加密*/
        //ch = ch + passwd;

        /*异或加密*/
        ch = ch^passwd;

        fputc(ch, fpw);            //写入文件
    }

    fclose(fpr);
    fclose(fpw);
}

//解密
void Decrypt(int passwd)    //传入数组,传入长度
{
    FILE *fpr;    //读取1-Encrypt.txt
    FILE *fpw;    //写入1-Decrypt.txt
    char pathr[100] = "c:\\1-Encrypt.txt";
    char pathw[100] = "c:\\1-Decrypt.txt";

    fpr = fopen(pathr, "r");    //读的模式打开加密后的文件1-Encrypt.txt
    fpw = fopen(pathw, "w");    //写的模式打开解密后要写入的文件1-Decrypt.txt

    if (fpr == NULL || fpw == NULL)
    {
        printf("文件故障,加密失败!\n");
        return;
    }

    while (!feof(fpr))            //一直读到要解密的文件末尾
    {
        char ch = fgetc(fpr);     //读取文本

        /*字符移位解密*/
        //ch = ch - passwd;

        /*异或解密*/
        ch = ch^passwd;

        fputc(ch, fpw);            //写入文件
    }

    fclose(fpr);
    fclose(fpw);
}

void Encrypt_str(int passwd[], int len)
{
    FILE *fpr;    //读取1.txt
    FILE *fpw;    //写入1-Encrypt.txt
    char pathr[100] = "c:\\1.txt";
    char pathw[100] = "c:\\1-Encrypt.txt";

    fpr = fopen(pathr, "rb");    //读的模式打开需要加密的文件    二进制加解密最精准
    fpw = fopen(pathw, "wb");    //写的模式打开要写入的加密文件

    if (fpr == NULL || fpw == NULL)
    {
        printf("文件故障,加密失败!\n");
        return;
    }

    int i = 0;            //标识取出加密数组的哪一位
    while (!feof(fpr))           //一直读到要加密的文件末尾
    {
        char ch = fgetc(fpr);    //读取文本

        /*字符移位加密*/
        //ch = ch + passwd;

        /*异或加密*/
        //ch = ch^passwd;

        /*字符串移位加密*/
        if (i > len - 1)        //如果加密数组完成,就继续重新开始
            i = 0;
        ch = ch + passwd[i];
        i++;                    //用完这个数组当前字符,移动到下一个字符

        fputc(ch, fpw);         //写入文件
    }

    fclose(fpr);
    fclose(fpw);
}

void Decrypt_str(int passwd[], int len)
{
    FILE *fpr;    //读取1-Encrypt.txt
    FILE *fpw;    //写入1-Decrypt.txt
    char pathr[100] = "c:\\1-Encrypt.txt";
    char pathw[100] = "c:\\1-Decrypt.txt";

    fpr = fopen(pathr, "rb");    //读的模式打开加密后的文件1-Encrypt.txt
    fpw = fopen(pathw, "wb");    //写的模式打开解密后要写入的文件1-Decrypt.txt

    if (fpr == NULL || fpw == NULL)
    {
        printf("文件故障,加密失败!\n");
        return;
    }

    int i = 0;
    while (!feof(fpr))            //一直读到要解密的文件末尾
    {
        char ch = fgetc(fpr);    //读取文本

        /*字符移位解密*/
        //ch = ch - passwd;

        /*异或解密*/
        //ch = ch^passwd;

        /*字符串移位解密*/
        if (i > len - 1)        //如果加密数组完成,就继续重新开始
            i = 0;
        ch = ch - passwd[i];
        i++;                    //用完这个数组当前字符,移动到下一个字符

        fputc(ch, fpw);            //写入文件
    }

    fclose(fpr);
    fclose(fpw);
}

void main()
{
    /*字符移位加密*/
    //Encrypt();
    //Decrypt();

    //Encrypt(6);
    //Decrypt(6);

    /*异或加密*/
    //Encrypt(15);
    //Decrypt(15);

    /*字符串移位加密*/
    char passwd[] = "helloworld";
    int n = strlen(passwd);
    Encrypt_str(passwd, n);
    Decrypt_str(passwd, n);

    system("pause");
}

5. 文件的分割与合并。

  分割文件:

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

//文件切割
void main()
{
    char path[100] = "c:\\1-文件分割与合并";      //文件夹路径
    char filename[50] = "test.mp4";             //文件名
    char lastpath[150];                         //存储文件的路径
    sprintf(lastpath, "%s\\%s", path, filename);//构建文件的路径

    int filesize = 0;                           //获取文件的大小
    FILE *fpr = fopen(lastpath, "rb");          //二进制读入的方式打开

    if (fpr == NULL)
    {
        perror("文件打开失败,原因是:");
        return;
    }

    fseek(fpr, 0, SEEK_END);                  //文件指针移动到末尾
    filesize = ftell(fpr);                    //获取文件指针与开头有几个字节
    printf("文件有%d个字节\n", filesize);

    int setsize = 1024 * 1024;                //设置要分割的模块大小
    int N;                                    //存储一个文件最多可以分割为多少个模块
    if (filesize%setsize == 0)
        N = filesize / setsize;
    else
        N = filesize / setsize + 1;

    fseek(fpr, 0, SEEK_SET);                  //文件指针移动到开头
    char listpath[100] = "c:\\1-文件分割与合并\\list.txt";
    FILE *fplist = fopen(listpath, "w");      //创建list.txt文件

    for (int i = 1; i <= N; i++)              //针对每一块进行处理
    {
        char temppath[120];                   //存储每一块的路径
        sprintf(temppath, "%s\\%d%s", path, i, filename);//构建每一块的文件名
        printf("%s\n", temppath);             //显示路径
        fputs(temppath, fplist);              //每一块的路径写入list.txt
        fputc(‘\n‘, fplist);                  //写入换行符

        FILE *fpb = fopen(temppath, "wb");    //按照二进制写入的模式打开文件
        if (i < N)
        {
            for (int j = 0; j < setsize; j++)                    //前面N-1个都是完整的
            {
                int ich = fgetc(fpr);        //读取一个字符
                fputc(ich, fpb);             //写入一个字符
            }
        }
        else
        {
            for (int j = 0; j < filesize-(N-1)*setsize; j++)    //最后一个不完整
            {
                int ich = fgetc(fpr);        //读取一个字符
                fputc(ich, fpb);             //写入一个字符
            }
        }
        fclose(fpb);                         //关闭写入的块文件
    }

    fclose(fplist);    //关闭列表文件
    fclose(fpr);       //关闭读取的文件
    system("pause");
}

  文件合并:

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

//文件合并
void main()
{
    char path[100] = "c:\\1-文件分割与合并\\list.txt";            //文件夹路径
    FILE *fpr = fopen(path, "r");                               //读的方式打开
    char allpath[100] = "c:\\1-文件分割与合并\\test-all.mp4";     //合并后的文件
    FILE *fpw = fopen(allpath, "wb");    //按照二进制写入的方式打开合并的文件
    char temppath[200];
    while (fgets(temppath, 200, fpr))    //不断循环地获取路径,fgets读到字符串值为非0;读不到或到末尾值为0
    {
        printf("%s", temppath);          //字符串有换行符
        int len = strlen(temppath);      //取出字符串长度
        temppath[len - 1] = ‘\0‘;        //换行符替换为‘\0’
        {
            FILE *fpb = fopen(temppath, "rb");       //按照二进制读取的方式打开文件
            int ich = fgetc(fpb);                    //读取一个字符
            while (!feof(fpb))           //没有到文件结束就继续
            {
                fputc(ich, fpw);         //写入要合并的文件
                ich = fgetc(fpb);
            }
            fclose(fpb);                //结束读取
        }

    }

    fclose(fpw);    //关闭要合并的文件的文件指针
    fclose(fpr);    //关闭list.txt的文件指针
    system("pause");
}

原文地址:https://www.cnblogs.com/si-lei/p/9467670.html

时间: 2024-10-09 10:25:01

2. C语言文件操作经典习题的相关文章

C语言文件操作函数的编写

 编写文件操作的头文件 /************************************************************************** Copyright(C)    :2014-08-5 toto Filename       :file.h Author          :涂作权 Version         :V1.1 Date            :2014-08-05 Description     :文件操作的头文件 Others  

C 语言文件操作

1. 数据流:     程序与数据的交互以流的形式进行.fopen 即打开数据流,fclose 即刷新数据流.     所谓数据流,是一种抽象,表示这段数据像流一样,需要逐步接收,不能随机存取:也意味着是一段连续的内容,每块数据之间的顺序是确定的.比如一个很大的文件,不能一次性加载到内存里面,无法直接获取文件任意位置的内容,只能逐渐加载到内存.     比如 TCP 被抽象为 stream 而 UDP 被抽象为 block.     2. 缓冲区:     fopen 时, 磁盘 --> 缓冲区

c语言文件操作函数

c语言文件操作函数大全 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. w 打开只写文件,若文件存在则文件长度清为0,即该文件

go语言文件操作,这期资料比较详细( 欢迎加入go语言群: 218160862 )

go语言文件操作,这期资料比较详细 欢迎加入go语言群: go语言深圳群 golang深圳 218160862 文件操作 func Open(name string) (file *File, err error),*File 是实现了 io.Reader这个接口byte[] 转化为 bytes.Buffer:bytes.NewBuffer([]byte). 一.建立与打开 建立文件函数:func Create(name string) (file *File, err Error)func N

C语言文件操作(一)

实例1:读写字符文件,每次读取一个字符. #include<stdio.h> #include <stdlib.h> int main() { FILE *fpin ; FILE *fpout; char c; fpout=fopen("c:\\dest.txt","wt"); if((fpin=fopen("c:\\test.txt","rt"))!=NULL) { c = fgetc(fpin);

C语言文件操作(二)

实例2:读取字符文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fin; FILE *fout=fopen("c:\\dest.txt","wt"); char buf[MAXLEN]; if((fin=fopen("c:\\test.txt","rt"))!=NULL

C语言文件操作(三)

实例3:读写字节文件,每次读入一个缓存里面. #include<stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main() { FILE *fpin ; FILE *fpout; unsigned char buf[MAXLEN]; int c; fpout=fopen("c:\\dest.jpg","wb"); if((fpin=fopen("c:\\test.jpg&q

C语言文件操作(四)

实例四:随机读写.在C:\\TEST.TXT 文件中创建如下字符串:我爱你,中国 使用随机读写,输出"中国"两个字,以为中文字符占两个字节,所以要从文件首部向后偏移7个字节,逗号是英文字符,占用一个字节. #include<stdio.h> #include <stdlib.h> int main() { FILE *fp ; char c; if((fp=fopen("c:\\test.txt","rb"))!=NULL

C语言文件操作函数大全(超详细)

C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,