/*
题目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 = ;
if (path == NULL || pout == NULL || row==NULL)
{
ERRO_MSG = ;
printf("", ERRO_MSG);
return ERRO_MSG;
}
//定义文件行数
int index = ;
//定义二维数组
char **parr1 = (char **)malloc(sizeof(char *)*index);
memset(parr1, , sizeof(sizeof(char *)*index));
if (parr1==NULL)
{
ERRO_MSG = 2;
printf("分配内存失败 erro msg:%d\n", ERRO_MSG);
return ERRO_MSG;
}
//定义文件指针
FILE *pfr = NULL;
//打开文件
pfr = fopen(path, "r");
if (pfr == NULL)
{
ERRO_MSG = ;
printf("打开文件失败 文件路径是%s; erro msg:%d\n",path, ERRO_MSG);
return ERRO_MSG;
}
while (!feof(pfr)){
//定义缓存数组
char *buf = (char *)malloc(sizeof(char)* );
if (buf==NULL)
{
ERRO_MSG = ;
printf("分配内存失败 erro msg:%d\n", ERRO_MSG);
goto FileEND;
}
memset(buf, , sizeof(char)* );
//fgets()读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0')
char *pflag= fgets(buf, , pfr);
//ferror()函数:获取文件流状态,如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。
if (pflag == NULL || ferror(pfr))
{
ERRO_MSG = ;
//重置文件流状态,清除错误信号
clearerr(pfr);
//注:如果不重置文件流状态,那么下次读取该文件正确状态仍然会报这个错误
printf("按行读取文件失败 erro msg:%d\n", path, ERRO_MSG);
goto FileEND;
}
//数据加入二维数组
parr1[index - ] = buf;
index++;
//重新分配内存空间
parr1 = (char **)realloc(parr1, sizeof(char *)*index);
}
FileEND:
//关闭文件指针
if (pfr!=NULL)
{
fclose(pfr);
pfr = NULL;
}
//二维数组最后一个元素置零
parr1[index - ] = NULL;
*pout = parr1;
*row = index - ;
return ERRO_MSG;
} //打印数据
void PeintfA(char **pin/*in*/){
if (pin==NULL)
{
printf("二维数组指针为空\n");
}
printf("以下是读取的数据\n");
while (*pin){
printf("%s\n", *pin);
pin++;
}
} //释放内存
int FreeAll(char ***pin/*in*/){
int ERRO_MSG = ;
if (pin == NULL)
{
ERRO_MSG = ;
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 = ,ret=;
ret = ReadFile(path, &pres, &row);
if (ret!=)
{
printf("读取文件出错\n");
goto END;
}
//打印文件
PeintfA(pres);
END:
FreeAll(&pres);
system("pause");
}

C语言 百炼成钢22的更多相关文章

  1. C语言 百炼成钢19

    /* 题目55: 有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口),输出以下结果 1) 以逗号分割字符串, ...

  2. C语言 百炼成钢8

    //题目22:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定 //比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x, z比,请编程序找出 //三 ...

  3. C语言 百炼成钢6

    //题目16:输入两个正整数m和n,求其最大公约数和最小公倍数. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include< ...

  4. 杭电ACM刷题(2):1005,Number Sequence 标签: 杭电acmC语言 2017-05-11 22:43 116人阅读

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  5. Java入门 - 语言基础 - 22.异常处理

    原文地址:http://www.work100.net/training/java-exception.html 更多教程:光束云 - 免费课程 异常处理 序号 文内章节 视频 1 概述 2 Exce ...

  6. C语言 百炼成钢3

    //题目7:用*号输出空心菱形图案 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...

  7. C语言 百炼成钢2

    //题目4:输入某年某月某日,判断这一天是这一年的第几天? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<st ...

  8. C语言 百炼成钢1

    //题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...

  9. C语言 百炼成钢18

    //题目52:用递归打印以下图形 //* //*.*. //*..*..*.. //*...*...*...*... //*....*....*....*....*.... #include<s ...

随机推荐

  1. CA证书服务器从2003迁移到2008 R2!

    1.在源 CA 服务器中备份相应的 CA :

  2. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h /////////////////////////////////////////////////////////////////////// ...

  3. Android传感器开发

    2013-07-02 Android 中传感器的种类 加速度,Sensor.TYPE_ACCELEROMETER 陀螺仪,Sensor.TYPE_GYROSCOPE 亮度,Sensor.TYPE_LI ...

  4. 【LeetCode】117. Populating Next Right Pointers in Each Node II (2 solutions)

    Populating Next Right Pointers in Each Node II Follow up for problem "Populating Next Right Poi ...

  5. 【算法剖析】寻找两个已序数组中的第k大元素

    1.问题描述 给定两个数组A与B,其大小分别为m.n,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第k大的元素,其中,1\le k\le(m+n).例如,对于数组A=[1, ...

  6. 查看nginx的版本

    查看nginx的版本 -v 显示 nginx 的版本-V 显示 nginx 的版本,编译器版本和配置参数 # /app/nginx/sbin/nginx -v nginx version: nginx ...

  7. Android成长之路-手势库的创建

      手势库的创建: 使用SDK自带的例子GestureBuilder建立手势库,这个文件夹存在于android\android-sdk-windows \samples\android-10\Gest ...

  8. spring in action 8.1 使用Spring web flow

    一.说明 Spring Web Flow是spring MVC的扩展,它支持基于流程的应用程序,他将流程的定义和实现流程行为的类和视图分离开来. 1.1 spring中配置web flow,目前需要在 ...

  9. s2sh框架整合具体配置-xml方式

    s2sh整合之xml方式 说明:本文档所採用的框架版本号为:Struts 2.1.8, Sping2.5.5,  Hibernate 3.5.6 1.    须要的jar包: ------------ ...

  10. 关于.net 2.0 remoting 中 TCP Channel 用户认证探讨(一)

    http://www.cnblogs.com/scucj/archive/2007/05/09/740808.html