文档章节

C 语言 二级指针操作文件 柔性数组使用

小张525
 小张525
发布于 05/20 22:24
字数 409
阅读 5
收藏 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef  struct  _info*  pInfo;

struct _info
{
	int line;
	int len;
	char data[0];
}info;


int getFileLine(FILE* fd)
{
	if (fd == NULL)
	{
		fprintf(stdout, "[%s]%d : get file line failed\r\n", __FILE__,__LINE__);
		return -1;
	}

	int num = 0;
	char buf[1024];
	while ((fgets(buf, 1024, fd)) != NULL)
	{
		num++;
	}

	// 注意文件指针的问题, 避免在计算文件的内容行数的时候, 计算为空.
	fseek(fd, 0, 0);
	return num;
}

int readFile(FILE *fd, int len, pInfo* pArray)
{
	if (fd == NULL || pArray == NULL || len <= 0)
	{
		return -1;
	}

	char buf[1024];
	int  line_len =0;
	int  index = 0;
	memset(buf, 0, 1024);
	while ((fgets(buf, 1024, fd)) != NULL)
	{
		int currentLen = 0;
		currentLen = strlen(buf) + 1;
		pInfo currentP = malloc(sizeof(info) + currentLen);
		currentP->len = strlen(buf);
		currentP->line = index;
		strcpy(currentP->data, buf);
		// append  to pArray;
		pArray[index] = currentP;
		index++;
		memset(buf, 0, 1024);
	}

	return 1;
}

void printFile(pInfo* pArray,int len)
{
	if (pArray == NULL)
	{
		return NULL;
	}

	pInfo  current = NULL;
	
	for (int i = 0; i < len; i++)
	{
		current = pArray[i];
		fprintf(stdout, " current %d line,current string len is:%d, current string is : %s", current->line,current->len,current->data);
	}

}

void freeNode(pInfo* pArray, int len)
{
	if(pArray == NULL || len  < 0)
	{
		return NULL;
	}


	for (int i=0;i<len;i++)
	{
		free(pArray[i]);
		pArray[i] = NULL;
	}

	free(pArray);
	pArray = NULL;
}





void test(const char* filename)
{
	if (filename == NULL)
	{
		return NULL;
	}

	FILE *fd = NULL;

	fd = fopen(filename,"r");
	if (fd == NULL)
	{
		return NULL;
	}

	int len = getFileLine(fd);
	if (len == -1)
	{
		return NULL;
	}


	pInfo* pArray = malloc(sizeof(pInfo)*len);
	if (pArray == NULL)
	{
		fprintf(stdout, "[%s]%d : malloc parray failed \r\n", __FILE__, __LINE__);
		return NULL;
	}

	int res = readFile(fd, len, pArray);
	if (res == -1)
	{
		fprintf(stdout, "[%s]%d : read file failed \r\n", __FILE__, __LINE__);
		return NULL;
	}

	// print;
	printFile(pArray, len);

	freeNode(pArray,len);

	pArray = NULL;
	if (pArray != NULL)
	{
		perror("parray is't empty\r\n");
	}
	else {
		perror("parray is empty\r\n");
	}
}



int main()
{

	const char* file = "./ReadMe.txt";
	test(file);

	return 0;
}

存在问题 :

如果读取的文件时中文时, 在console中输出是乱码.

 

 

© 著作权归作者所有

上一篇: C offsetof
小张525
粉丝 6
博文 111
码字总数 37874
作品 0
乌鲁木齐
程序员
私信 提问
深入浅出C语言中的柔性数组

深入浅出C语言中的柔性数组 在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如...

长平狐
2013/06/03
35
0
2675字带你进阶C语言中的关键字.md

C语言进阶之C语言关键字 关键字总结.png 基本数据类型 1.数据类型 数据类型可以理解为固定内存大小的别名(例如,在C语言中int数据类型代表了4个字节的内存) 数据类型是可以创建变量的模板...

PcDack
2017/12/03
0
0
或许有一两点你不知的C语言特性

关键字篇 volatile关键字 鲜为人知的关键字之一volatile,表示变量是'易变的',之所以会有这个关键字,主要是消除编译优化带来的一些问题,看下面的代码 1 int a = 8;2 int b = a;3 int c = ...

吕亚辉
2015/08/02
0
0
结构体最后的长度为0或1数组的作用

其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的《系统程序员成长计划》里看...

j_m
2012/03/14
0
0
C/C++之C及C++发展史及标准

Tips:  1. 本人当初学习C/C++的记录。  2. 资源很多都是来自网上的,如有版权请及时告知!  3. 可能会有些错误。如果看到,希望能指出,以此共勉! C和C++   C++是C语言的一个超集。C...

zcshoucsdn
2017/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

给Word加目录的正确方式

很多职场新人都搞不清楚:你辛辛苦苦、加班加点做的Word方案/计划,在领导面前啥都不是,花5分钟看都觉得浪费时间。 所以聪明人都会标记出Word文档中的重点,让领导一目了然,在1分钟内就能清...

太空堡垒_185
23分钟前
0
0
SpringCloud微服务架构升级总结

一、背景 1.1 应用系统的架构历史 1.2 什么是微服务? 起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提...

宜信技术学院
30分钟前
15
0
kafka在windows下的安装(kafka_2.12-2.2.1)

kafka 的介绍我就不赘述了,本人理解不深,为实现sping-cloud配置自动刷新使用kafka,总结如下: 一、下载最新版本,我用的是2.12-2.2.1 http://kafka.apache.org/downloads 二、安装 1、解压...

pipi1919
32分钟前
0
0
vue中clearInterva清除失效解决方法

const chatTimer = setInterval(() => { console.log(chatTimer); this.chatMsg(); }, 1000);this.$once('hook:beforeDestroy', () => { clearInterval(chatTimer); })......

25903014
36分钟前
0
0
关于 Java 类加载器的这一点,市面上没有任何一本图书讲到

一、一个程序员的思考 大家都知道,Tomcat 处理业务,靠什么?最终是靠我们自己编写的 Servlet。你可能说你不写 servlet,你用 spring MVC,那也是人家帮你写好了,你只需要配置就行。在这里...

爱编程的浪子
40分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部