zoukankan      html  css  js  c++  java
  • C语言 百炼成钢22

    /*
    题目58: 编写一个业务函数,实现按行读取文件。把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。
    函数原型有两个,任意选择其一
    要求1:请自己任意选择一个接口(函数),并实现功能;70分
    要求2:编写测试用例。30分
    要求3:自己编写内存释放函数
    */
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    //按行读取文件
    int ReadFile(const char *path/*in*/,char ***pout/*out*/,int *row){
        int ERRO_MSG = 0;
        if (path == NULL || pout == NULL || row==NULL)
        {
            ERRO_MSG = 1;
            printf("", ERRO_MSG);
            return ERRO_MSG;
        }
        //定义文件行数
        int index = 1;
        //定义二维数组
        char **parr1 = (char **)malloc(sizeof(char *)*index);
        memset(parr1, 0, sizeof(sizeof(char *)*index));
        if (parr1==NULL)
        {
            ERRO_MSG = 2;
            printf("分配内存失败 erro msg:%d
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        //定义文件指针
        FILE *pfr = NULL;
        //打开文件
        pfr = fopen(path, "r");
        if (pfr == NULL)
        {
            ERRO_MSG = 3;
            printf("打开文件失败 文件路径是%s; erro msg:%d
    ",path, ERRO_MSG);
            return ERRO_MSG;
        }
        while (!feof(pfr)){
            //定义缓存数组
            char *buf = (char *)malloc(sizeof(char)* 100);
            if (buf==NULL)
            {
                ERRO_MSG = 5;
                printf("分配内存失败 erro msg:%d
    ", ERRO_MSG);
                goto FileEND;
            }
            memset(buf, 0, sizeof(char)* 100);
            //fgets()读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'')
            char *pflag= fgets(buf, 100, pfr);
            //ferror()函数:获取文件流状态,如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。
            if (pflag == NULL || ferror(pfr))
            {
                ERRO_MSG = 4;
                //重置文件流状态,清除错误信号
                clearerr(pfr);
                //注:如果不重置文件流状态,那么下次读取该文件正确状态仍然会报这个错误
                printf("按行读取文件失败 erro msg:%d
    ", path, ERRO_MSG);
                goto FileEND;
            }
            //数据加入二维数组
            parr1[index - 1] = buf;
            index++;
            //重新分配内存空间
            parr1 = (char **)realloc(parr1, sizeof(char *)*index);
        }
    FileEND:
        //关闭文件指针
        if (pfr!=NULL)
        {
            fclose(pfr);
            pfr = NULL;
        }
        //二维数组最后一个元素置零
        parr1[index - 1] = NULL;
        *pout = parr1;
        *row = index - 1;
        return ERRO_MSG;
    }
    
    //打印数据
    void PeintfA(char **pin/*in*/){
        if (pin==NULL)
        {
            printf("二维数组指针为空
    ");
        }
        printf("以下是读取的数据
    ");
        while (*pin){
            printf("%s
    ", *pin);
            pin++;
        }
    }
    
    //释放内存
    int FreeAll(char ***pin/*in*/){
        int ERRO_MSG = 0;
        if (pin == NULL)
        {
            ERRO_MSG = 1;
            printf("", ERRO_MSG);
            return ERRO_MSG;
        }
        char **ptemp = *pin;
        while (*ptemp){
            free(*ptemp);
            *ptemp = NULL;
            ptemp++;
        }
        //报错:触发了一个断点
        //原因:ptemp指针移动位置了
        if (*pin != NULL)
        {
            free(*pin);
            *pin = NULL;
        }
        
        return ERRO_MSG;
    }
    
    void main(){
        char *path = "E:/Look/a.txt";
        //定义返回数组
        char **pres = NULL;
        //定义返回行 测试参数
        int row = 0,ret=0;
        ret = ReadFile(path, &pres, &row);
        if (ret!=0)
        {
            printf("读取文件出错
    ");
            goto END;
        }
        //打印文件
        PeintfA(pres);
    END:
        FreeAll(&pres);
        system("pause");
    }

  • 相关阅读:
    网页图表Highcharts实践教程之外层图表区
    网页图表Highcharts实践教程之图表代码构成
    网页图表Highcharts实践教程之认识Highcharts
    Playmaker全面实践教程之Playmaker常用工具
    Playmaker全面实践教程之简单的使用Playmaker示例
    Playmaker全面实践教程之playMaker编辑器
    Playmaker Input篇教程之引入的核心概念
    Playmaker Input篇教程之PlayMaker菜单概述
    Playmaker Input篇教程之Playmaker购买下载和导入
    关于中值滤波算法,以及C语言实现(转)
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5597244.html
Copyright © 2011-2022 走看看