二级指针读取文件(显示行数、读取、释放内存)

1.读取的文件

test.txt
在这里插入图片描述

2.c代码

duQu01.c

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


int getFileLine(FILE *file)//文件有几行
{
	if (file == NULL)
	{
		printf("Read failed!");
		return -1;
	}
	int num = 0;
	//读取的文件存入buf
	char buf[1024] = { 0 };
	while (fgets(buf, 1024, file)!=NULL)
	{
		num++;
		//printf("%s", buf);
	}
	//指针移到末尾,需要将文件光标置为文件首
	fseek(file, 0, 0);
	printf("文件有几行:%d\n", num);
	return num;
	/*int fseek( FILE *stream, long offset, int origin );
  第一个参数stream为文件指针
  第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
  第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
  SEEK_SET: 文件开头
  SEEK_CUR: 当前位置
  SEEK_END: 文件结尾
  其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.*/
}
readFileData(FILE *file,int len,char **pArray)
{
	if (file == NULL)
	{
		//printf("Read failed!");
		return -1;
	}
	if (len <= 0)
	{
		printf("长度小于0");
	}
	if (pArray == NULL)
	{
		return -1;
	}
	//读取的文件存入buf
	char buf[1024] = { 0 };
	int index = 0;
	while (fgets(buf, 1024, file) != NULL)
	{
		//计算第1行有多少字节,加上\0
		int currentlen = strlen(buf) + 1;
		//开辟该行空间
		char *cp = malloc(sizeof(char)*currentlen);
		//复制到cp
		strcpy(cp, buf);
		//将数据拷贝到堆区内存中
		pArray[index++] = cp;
		//释放缓冲区
		memset(buf, 0, 1024);
	}
}

//显示数据
show(char **pArray, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("第%d行是:%s",i+1,pArray[i]);
	}
}

//释放内存
freeSpace(char **pArray, int len)
{
	//先释放小的
	for (int i = 0; i < len; i++)
	{
		if (pArray[i] != NULL)
		{
			free(pArray[i]);
			pArray[i] = NULL;
		}
	}
	free(pArray);
	pArray = NULL;
}

void test01()//测试函数
{
	//读取文件
	FILE *file = NULL;
	file=fopen("./test.txt", "r");
	if (file == NULL)
	{
		printf("Read failed!");
		//return 0;
	}
	//文件有几行
	int len = getFileLine(file);
	//堆区开辟len个char*空间,二级指针
	char **pArray = malloc(sizeof(char*)*len);
	//读取文件数据,存入pArray
	readFileData(file, len, pArray);
	//显示数据
	show(pArray, len);
	//释放内存
	freeSpace(pArray, len);
	pArray = NULL;//防止野指针
}

int main()
{
	test01();
	system("pause");
	return 0;
}

3.结果显示

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐维康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值