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;
}