读取配置文件信息 ,并且将信息存放到 数组中 标题 注意: 释放堆区,关闭文件
需要注意的是:
-
对文件操作后,指针会移动,那么此时若想从头读取文件信息时,
需要rewind()回到文件开始位置 -
二级指针使用要注意是 主调函数创建 还是被调函数创建
-
学会封装,将模块化思想牢记于心
算法思想:
- 打开和关闭文件操作
- 获取到文件内容行数----这里通过fgets()函数按行读取特性
- 按行读取内容到数组中----在被调函数内部创建堆区内存保存内容,并每次将辅助数组清零操作
- 打印数组内容
- 释放堆区内存----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;
}