- 需求:从文件中读取数据,并且将数据存放到堆区的数组中
- char ** pArray = malloc(sizeof(char *) * len )
- 获取有效行数
- 将文件光标置为文件首 fseek(file , 0 ,SEEK_SET)
- 读取文件数据并且放入到pArray中
- 显示数组pArray
- 释放数组pArray
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//获取文件的行数
int getFileLines(FILE * file)
{
if (file == NULL)
{
return -1;
}
char buf[1024]; //读取的数据存入到buf
int num = 0;
while (fgets(buf, 1024, file) != NULL)
{
num++;
//printf("%s", buf);
}
//将文件光标 置为文件首
fseek(file, 0, SEEK_SET);
return num;
}
//参数1 文件指针 参数2 有效行数 参数3 堆区数组
void readFileData(FILE * file, int len, char ** pArray)
{
if (file == NULL)
{
return;
}
if (len <= 0)
{
return;
}
if (pArray == NULL)
{
return;
}
char buf[1024]; //读取的数据存入到buf
int index = 0;
while (fgets(buf, 1024, file) != NULL)
{
//buf中就是存放的每行的数据
/*
aaaaaaaaaa
bbbb
ccccc
*/
int currentLen = strlen(buf) + 1;
char * currentP = malloc(sizeof(char)*currentLen);
//将数据拷贝到堆区内存中
strcpy(currentP, buf);
pArray[index++] = currentP;
//清空缓冲区
memset(buf, 0, 1024);
}
}
void showFileData(char** pArray, int len)
{
for (int i = 0; i < len; i++)
{
printf("第 %d 行的数据为 %s", i + 1, pArray[i]);
}
}
void 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 = fopen("./test.txt", "r");
if (file == NULL)
{
printf("文件打开失败\n");
return;
}
int len = getFileLines(file);
printf("文件的有效行数为:%d\n", len);
char ** pArray = malloc(sizeof(char *)*len);
//将文件中的数据 读取后 放入到pArray中
readFileData(file, len, pArray);
//打印数据
showFileData(pArray, len);
//释放数据
freeSpace(pArray, len);
pArray = NULL;
//关闭文件
fclose(file);
file = NULL;
}
int main() {
test01();
system("pause");
return EXIT_SUCCESS;
}
![](https://i-blog.csdnimg.cn/blog_migrate/052689814b1b100315ce2cbe89887d45.png)