您的位置:首页 > 编程语言 > C语言/C++

C语言 百炼成钢22

2016-06-19 00:11 447 查看
/*
题目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\n", ERRO_MSG);
return ERRO_MSG;
}
//定义文件指针
FILE *pfr = NULL;
//打开文件
pfr = fopen(path, "r");
if (pfr == NULL)
{
ERRO_MSG = 3;
printf("打开文件失败 文件路径是%s; erro msg:%d\n",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\n", ERRO_MSG);
goto FileEND;
}
memset(buf, 0, sizeof(char)* 100);
//fgets()读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0')
char *pflag= fgets(buf, 100, pfr);
//ferror()函数:获取文件流状态,如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。
if (pflag == NULL || ferror(pfr))
{
ERRO_MSG = 4;
//重置文件流状态,清除错误信号
clearerr(pfr);
//注:如果不重置文件流状态,那么下次读取该文件正确状态仍然会报这个错误
printf("按行读取文件失败 erro msg:%d\n", 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("二维数组指针为空\n");
}
printf("以下是读取的数据\n");
while (*pin){
printf("%s\n", *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("读取文件出错\n");
goto END;
}
//打印文件
PeintfA(pres);
END:
FreeAll(&pres);
system("pause");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: