c 写一个文本浏览器(1)

写一个象vi一样的文本浏览器

下面代码是读出文本每一行并保存。主要是三个参数: 行号,每行内容,每行的字节数

重点是分配内存,特别是struct line 中的data 内存分配,先预扫文件得到有多少行和最多一行的字节数。再malloc 内存。

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
	       int  hh;      //行号
    		char *data;   // 行内容(以 \n 结尾)
   		 int  len;     //每行 实际长度
	} Line;


int main(void){
       FILE *f=fopen("/home/wjs/Documents/glibc.txt","r");
	if(f==NULL){
		perror("file");
		exit(1);
	   }

	int zhh=0;              //总行数
	int zh_len=0;           //没行总字节数
	int ch;
	int ls=zh_len;
	while((ch=fgetc(f))!=EOF){
		zh_len++;
		if(ch=='\n'){
		    zhh++;
		    if(zh_len>ls)  ls=zh_len;
		     zh_len=0;
		}
	}	
      if(zh_len>0)  zhh++;  // 防止文件最后一句没有'\n',直接EOF
	zh_len=ls;
	
	rewind(f);
  
	Line  *p=malloc(zhh*sizeof(Line));
       

       int hh=1;    
	int idx=0; 

	
       char *hnr=malloc(zh_len+1);

	int h_len=0;
	int h_char;
 	while((h_char=fgetc(f))!=EOF){
	 
		if(h_char=='\n'){
				(p+idx)->data=malloc(zh_len+1);

				(p+idx)->len=h_len;
				(p+idx)->hh=hh;
				strncpy((p+idx)->data,hnr,h_len);
				((p+idx)->data)[h_len]='\0';	
				memset(hnr,'\0',zh_len+1);                                         

				idx++;
			       hh++;
				h_len=0;
				
				
		}

		if(h_char!='\n'){
			hnr[h_len]=h_char;
			h_len++;
			
		}
	   
		
	}
    
    	if (h_len > 0) {                             // 防止文件最后一句没有'\n',直接EOF                
   		 p[idx].data = malloc(h_len + 1);
   		 p[idx].len  = h_len;
  		  p[idx].hh   = hh;
   		 memcpy(p[idx].data, hnr, h_len);
   		 p[idx].data[h_len] = '\0';
    		idx++;
	}
       

	hh=284;
	if(hh>zhh){
		puts("hh over");
		exit(1);
	}
 
		
	idx=hh-1;

	printf("hh=%d:h_ken=%d\n%s\n",(p+idx)->hh,(p+idx)->len,(p+idx)->data);                 

	for (int i = 0; i < zhh; i++) {
   		free(p[i].data);
	}
      
	free(p);
	free(hnr);
	return 0;
}
相关推荐
starzy199014 分钟前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_23 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
白杨尚青2 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
.道阻且长.2 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言
starzy19903 小时前
深入理解Scala匿名函数:函数式编程基石
开发语言·scala
apcipot_rain4 小时前
C++转Java日记(05)
java·开发语言·c++
apcipot_rain12 小时前
C++转Java日记(04)
java·开发语言·c++
wuyk55512 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
云和数据.ChenGuang14 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
蜗牛一步步往上爬17 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习