/*
题目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. angularjs中的ng-src和ng-href

    ng-src和ng-href等同于html中的src和href,只是ng是在dom加载完毕之后才能够发挥作用,如果在src或href中绑定变量,如果ng没有加载完,会导致链接地址出错,如果用对应的ng ...

  2. 数据挖掘学习指引&lt;一&gt;

    对于当前热门的大数据.云计算等技术,被百度.阿里等国内互联网巨头炒的非常火,数据挖掘作为一门非常有用的技术,在商业管理.市场分析.科学计算等大数据方面发挥着大作用. 数据挖掘技术也变得非常火,why? ...

  3. jquery 图片自动切换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. unix 网络编程 第五章

    个人对unix 网络编程中的代码进行了精简,保留了主要和关键部分. 1 tcpserve01 程序见 https://github.com/juniperdiego/Unix-network-prog ...

  5. Android设计模式系列(3)--SDK源码之单例模式

    单例模式,可以说是GOF的23种设计模式中最简单的一个.这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本 ...

  6. javascript sort方法容易犯错的地方

    sort方法用来对数组排序非常方便.但是sort(func)这个func参数的构造却很容易混淆. sort判断func的返回值是判断正负,而不是ture和false.所以务必保证返回值要么负数要么正数 ...

  7. atoi 和 itoa

    转自:http://www.cnblogs.com/cobbliu/archive/2012/08/25/2656176.html atoi 和 itoa是面试笔试经常要考到的题目,下面两份代码是用C ...

  8. miniui前端绑定枚举值

    <script type="text/javascript"> var ConvertData = { DeliveryWays: function (e, cycle ...

  9. Python 爬虫实例(1)—— 爬取百度图片

    爬取百度图片  在Python 2.7上运行 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: loveNight import jso ...

  10. 小米手机解锁bootload教程及常见问题

    小米手机解锁bl需要在官网提交申请,然后电脑解锁,具体步骤如下: 1.首先需要注册一个小米账号,并登陆. 2.到官网解锁网页提交申请:http://www.miui.com/unlock/index. ...