編寫一個業務函數,實現按行讀取文件。把內容按照第三種內存模型打包數據傳出,把行數通過函數參數傳出。

編寫一個業務函數,實現按行讀取文件。把內容按照第三種內存模型打包數據傳出,把行數通過函數參數傳出。
函數原型有兩個,任意選擇其一
要求1:請自己任意選擇一個接口(函數),並實現功能;70
要求2:編寫測試用例。30
要求3:自己編寫內存釋放函數
*/
char **readFile1(const char *pfilename/*in*/, int *lineNum/*in out*/);
int readFile2(const char *pfilename/*in*/, char ***p/*out*/, int *lineNum/*int out*/);

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

char **readFile1(const char *pfilename/*in*/, int *lineNum/*in out*/);
int readFile2(const char *pfilename/*in*/, char ***p/*out*/);

char **readFile1(const char *pfilename/*in*/, int *lineNum/*in out*/)
{
int rv = 0;
FILE *fp = NULL;
char lineBuf[1024 * 4];


char **pTmp = NULL;
char *p = NULL;
int tmpLine = 0, strLine = 0, i = 0;


if (pfilename == NULL || lineNum == NULL)
{
rv = -1;
printf("readFile1() err. param err \n");
goto End;
}
fp = fopen(pfilename, "r");
if (fp == NULL)
{
rv = -2;
printf("fopen() err. \n");
goto End;
}
   
while(!feof(fp))
{
memset(lineBuf, 0, sizeof(lineBuf));
p = fgets(lineBuf, 1024 * 4, fp);
if (p == NULL)
{
break;
}
else
{
tmpLine++;
}
}
pTmp = (char **)malloc(tmpLine * sizeof(char *));
if (pTmp == NULL)
{
rv = -2;
printf("malloc() err. \n");
goto End;
}


//讓文件指針指向文件的開頭,目的:第二次從頭檢索
fseek(fp, 0L, SEEK_SET);


i = 0;
while (!feof(fp))
{
//讀每一行
memset(lineBuf, 0, sizeof(lineBuf));
p = fgets(lineBuf, 1024 * 4, fp);
if (p == NULL)
{
break;
}


strLine = strlen(lineBuf);
pTmp[i] = (char *)malloc((strLine + 1) * sizeof(char));
if (pTmp[i] == NULL)
{
rv = -3;
printf("malloc() err. \n");
goto End;
}
strcpy(pTmp[i], lineBuf);
i++;
}
End:


if (fp != NULL)
{
fclose(fp);
}
//賦值
*lineNum = tmpLine;
return pTmp;


}


void FreeMypp(char **p, int linenum)
{
int i = 0;
if (p == NULL)
{
return NULL;
}
for (i = 0; i<linenum; i++)
{
if (p[i] != NULL)
{
free(p[i]);
}
}
free(p);
return;
}


int readFile2(const char *pfilename/*in*/, char ***myfileP/*in out*/)
{
int rv = 0;
FILE *fp = NULL;
char lineBuf[1024 * 4];


char **pTmp = NULL;
char *p = NULL;
int tmpLine = 0, strLine = 0, i = 0;


if (pfilename == NULL || myfileP == NULL)
{
rv = -1;
printf("readFile1() err. param err \n");
goto End;
}


fp = fopen(pfilename, "r");
if (fp == NULL)
{
rv = -2;
printf("fopen() err. \n");
goto End;
}


//第一遍 讀取文件有多少行
while (!feof(fp))
{
//讀每一行
memset(lineBuf, 0, sizeof(lineBuf));
p = fgets(lineBuf, 1024 * 4, fp);
if (p == NULL)
{
break;
}
else
{
tmpLine++;
}
}


pTmp = (char **)malloc((tmpLine + 1) * sizeof(char *));
if (pTmp == NULL)
{
rv = -2;
printf("malloc() err. \n");
goto End;
}
memset(pTmp, 0, (tmpLine + 1) * sizeof(char *));


//讓文件指針指向文件的開頭,目的:第二次從頭檢索
fseek(fp, 0L, SEEK_SET);


//
i = 0;
while (!feof(fp))
{
//讀每一行
memset(lineBuf, 0, sizeof(lineBuf));
p = fgets(lineBuf, 1024 * 4, fp);
if (p == NULL)
{
break;
}


strLine = strlen(lineBuf);
pTmp[i] = (char *)malloc((strLine + 1) * sizeof(char));
if (pTmp[i] == NULL)
{
rv = -3;
printf("malloc() err. \n");
goto End;
}
strcpy(pTmp[i], lineBuf);
i++;
}






End:
if (fp != NULL)
{
fclose(fp);
}
//賦值
//*lineNum = tmpLine;
*myfileP = pTmp;
return rv;
}


void FreeMypp3(char **p)
{
int i = 0;
if (p == NULL)
{
return NULL;
}
for (i = 0; p[i] != NULL; i++)
{
if (p[i] != NULL)
{
free(p[i]);
}
}
free(p);
return;
}
void main01()
{
int ret = 0;
int linenum = 0;
const char *pfilename = "D:\\test\\a.txt";
char **p = NULL;
int i = 0;
p = readFile1(pfilename/*in*/, &linenum/*in out*/); 
if (p == NULL)
{
ret = -1;
printf("func err readFile1(pfilename/*in*/, &linenum/*in out*/); err :%d\n",ret);
}
for (i = 0; i<linenum; i++)
{
printf("%s\n", p[i]);
}


FreeMypp(p, linenum);

system("pause");
}
void main()
{
int ret = 0;
int linenum = 0;
const char *pfilename = "D:\\test\\a.txt";
char **p = NULL;
int i = 0;


ret = readFile2(pfilename/*in*/, &p/*out*/);


if (ret != 0)
{
return;
         } 


for (i = 0; p[i] != NULL; i++)
{
printf("%s\n", p[i]);
}
FreeMypp3(p);


system("pause");
}

發佈了61 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章