当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]    之前写过类似的文章: https://blog.csdn.net/morixinguan/article/details/83309576     关于文件操作,特别是从后往前读取,要是像上面这篇文章一样去操作,那效率明显就太低了,如果一旦数据一多,很难处理。     于是想到了用更好的数据结构来解决这

    之前写过类似的文章:

https://blog.csdn.net/morixinguan/article/details/83309576

    关于文件操作,特别是从后往前读取,要是像上面这篇文章一样去操作,那效率明显就太低了,如果一旦数据一多,很难处理。

    于是想到了用更好的数据结构来解决这个问题,不就是想从后往前显示嘛?那么就可以用链表来解决这个问题了。

    

typedef struct links

{

int size  ; 

void *ptr ; 

struct links *next ;

struct links *pre  ;

}LINKS;

    这是链表的数据结构,ptr就是要存放的数据,pre是前驱指针,next是后继指针,通过这两个指针,即可以方便实现链表的遍历。

   下面定义要实现的函数:

typedef  void (*print_t)(void *Data)  ; 

void print(void *Data);

//打印链表节点

void   print_links(LINKS *Header , print_t  func);

//创建链表头

LINKS  *Create_Links_Header(int size);

//头插

void  top_append(LINKS *Header , void *Data , int size);

//获取文件总行数

int GetTotalLineCount(FILE *file);

    

整体实现:

#include<stdio.h>

#include<stdlib.h>

#include <string.h>

#define  NR(x)   (sizeof(x)/sizeof(x[0]+0))

 

typedef struct links

{

int size  ; 

void *ptr ; 

struct links *next ;

struct links *pre  ;

}LINKS;

 

typedef  void (*print_t)(void *Data)  ; 

void print(void *Data);

void   print_links(LINKS *Header , print_t  func);

LINKS  *Create_Links_Header(int size);

void  top_append(LINKS *Header , void *Data , int size);

int GetTotalLineCount(FILE *file);

 

 

int main(void)

{

int line = 0 ;

int file_all_line = 0 ;

char line_buffer[50] = {0};

LINKS *Header = NULL ;

//1.初始化链表 

Header =  Create_Links_Header(0);

if(NULL == Header)

{

fprintf(stderr , "malloc  Header fail \n");

return -1 ; 

}

//2.插入数据 

FILE *fp = NULL ;

fp = fopen("1.csv","r");

if(NULL == fp)

{

printf("open csv file fail!\n");

return -1 ;

}

//移到文件头 

fseek(fp,0,SEEK_SET);

//获取文件的总行数 

file_all_line = GetTotalLineCount(fp);

for(line = 0 ; line < file_all_line ; line++)

{

if(fgets(line_buffer,50,fp))

{

printf("line_buffer:%s",line_buffer);

top_append(Header , line_buffer , 100);

}

}

print_links(Header,print);

fclose(fp);

free(Header);

return 0 ;

}

 

void print(void *Data)

{

printf("%s" ,Data);

//这里可以进行数据处理...

//这里可以进行数据处理...

}

//打印链表节点

void print_links(LINKS *Header , print_t func)

{

LINKS *tmp = Header->next ; 

 

while(tmp != Header)

{

func(tmp->ptr);

tmp = tmp->next ;

        free(tmp->pre);

}

}

//获取文件的总行数

int GetTotalLineCount(FILE *file)

{   

int line_num = 0;

char strLine[50];

fseek(file,0,SEEK_SET);

while (fgets(strLine, 50, file))

line_num++;

fseek(file,0,SEEK_SET);

return line_num;

}

//创建表头

LINKS  *Create_Links_Header(int size)

{

LINKS *New = NULL  ; 

New = malloc(sizeof(LINKS));

if(NULL == New)

{

fprintf(stderr , "malloc LINKS header fail \n");

return NULL ; 

}

 

New->size = size ; 

New->ptr = NULL ; 

New->next = New ;

New->pre  = New ; 

 

return New ;

}

//链表头插

void  top_append(LINKS *Header , void *Data , int size)

{

LINKS *New = NULL ; 

New = malloc(sizeof(LINKS));

if(NULL == New)

{

fprintf(stderr , "malloc links fail \n");

return ;

}

New->ptr=NULL ;

New->size = size ; 

 

New->ptr = malloc(size);

if(NULL == New->ptr)

{

fprintf(stderr , "malloc links data fail \n");

return ; 

}

memcpy(New->ptr , Data , size);

New->next = Header->next ; 

New->pre  = Header ; 

New->next->pre = New ;  

New->pre->next = New ; 

}

 

运行结果:

如下图所示为excel文件的数据:

运行程序得到:

从这里看到,整个程序就是利用了栈的思想,先进后出,这样的实现既简单,也高效。

 

 


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭