二级指针-文件操作

读取配置文件信息 ,并且将信息存放到 数组中 标题 注意: 释放堆区,关闭文件

需要注意的是:

  1. 对文件操作后,指针会移动,那么此时若想从头读取文件信息时,
    需要rewind()回到文件开始位置

  2. 二级指针使用要注意是 主调函数创建 还是被调函数创建

  3. 学会封装,将模块化思想牢记于心

算法思想:

  1. 打开和关闭文件操作
  2. 获取到文件内容行数----这里通过fgets()函数按行读取特性
  3. 按行读取内容到数组中----在被调函数内部创建堆区内存保存内容,并每次将辅助数组清零操作
  4. 打印数组内容
  5. 释放堆区内存----free(pArray),注意置空:pArray=NULL
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
//7.1	读取配置文件信息 ,并且将信息存放到 数组中
//7.2	注意: 释放堆区,关闭文件

int readFileLines(FILE* fp) {
	if (fp == NULL)
	{
		return -1;
	}

	int num=0;
	char buf[1024] = { 0 };
	while (fgets(buf,1024,fp))
	{
		num++;
	}
	//将文件指针回卷到文件开始处
	rewind(fp);
	return num;

}

void readDateByLine(FILE*fp, int lines,char ** pArray) {

	if (fp == NULL)
	{
		return ;
	}
	if (lines <= 0)
	{
		return ;
	}
	if (pArray == NULL)
	{
		return ;
	}
	
	char buf[1024] = { 0 };
	int index = 0;
	while (fgets(buf,1024,fp) != NULL)
	{
		/*
		aaaaaaaaaa
		bbbb
		cccccc
		*/
		int currentLen = strlen(buf) + 1;
		char * currentStrp = malloc(sizeof(char) * currentLen);
		if (currentStrp == NULL)
		{
			perror("内存分配失败:");
			return;
		}
		strcpy(currentStrp, buf);
		pArray[index++] = currentStrp;

		memset(buf, 0, 1024);
	}


}


void showData(char **pArray,int lines) {
	for (size_t i = 0; i < lines; i++)
	{
		printf("%d行的数据为%s",i+1,pArray[i] );
	}
	printf("\n");
	
}
void test004() {
	int lines;
	
	//打开文件
	FILE* fp = fopen("./test.txt","r");
	if (fp == NULL)
	{
		perror("Failed open:");
		return;
	}
	//读取文件行数
	lines = readFileLines(fp);

	char** pArray = malloc(sizeof(char *)*lines);

	//按行读取内容,并且读取到数组中
	readDateByLine(fp,lines,pArray);
	//printf("%d", lines);

	//打印数据
	showData(pArray,lines);
	free(pArray);
	pArray = NULL;
	fclose(fp);
}


int main(void)
{
	test004();
	system("pause");
	return EXIT_SUCCESS;
}

上一篇:c语言 13 - 6


下一篇:NameError: name ‘file‘ is not defined