| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 426 人关注过本帖
标题:明确一下需求 大神看过了,帮忙给点指点 文件读写和内存分配问题
只看楼主 加入收藏
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:6 
明确一下需求 大神看过了,帮忙给点指点 文件读写和内存分配问题
需求
1.读取tags文件
图片附件: 游客没有浏览图片的权限,请 登录注册

2.删除无用信息如
!_TAG_FILE_FORMAT    2    /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED    0    /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert    /dhiebert@users.
!_TAG_PROGRAM_NAME    Exuberant Ctags    //
!_TAG_PROGRAM_URL    http://ctags.    /official site/
!_TAG_PROGRAM_VERSION    5.8    //
g_uiQuadrantTable    fuction.c    45;"    v
g_SubdivisionTable    fuction.c    47;"    v
g_DisAmendTable    fuction.c    54;"    v
g_PitAmendTable    fuction.c    88;"    v
3.提取
Xint1    fuction.c    105;"    f
Timer1_isr    fuction.c    219;"    f
Timer2_3_isr    fuction.c    236;"    f
RecvGroundBuf    fuction.c    271;"    f
RecvPriBuf    fuction.c    315;"    f
SelfCheck    fuction.c    373;"    f
CheckAziAndPitPower    fuction.c    421;"    f
CheckFpga    fuction.c    454;"    f
CheckRange    fuction.c    487;"    f
GroundCheck    fuction.c    516;"    f
GetGroundData    fuction.c    621;"    f
Delay    fuction.c    668;"    f
KICK_DOG    fuction.c    678;"    f
GetDataFrom3To2    fuction.c    687;"    f
Target_Scan    fuction.c    708;"    f
SmallScan    fuction.c    766;"    f
BigScan    fuction.c    785;"    f
-----------------信息如下------------------
Xint1(子函数名)    fuction.c(所属源文件)    105;"(行号)    f(代表是子函数)
4.将字符串转105;" 换为 Int的105
void  ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo);
char* RepladeTabWithSpace(char* buffer);
unsigned int  GetUseLinenum(char* p);
5.读取源文件 由各个子函数的起始行号(如105,219-1)可以定位出第一个子函数的所有行号
定位各个子函数的起始,结束行号
图片附件: 游客没有浏览图片的权限,请 登录注册


6.导出所有的子函数,导入到以每个子函数为名的文件中
搜索更多相关主题的帖子: 内存 official Darren 
2012-11-30 10:47
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
#ifndef __ADSC_FILE_H__
#define __ADSC_FILE_H__


typedef struct tagFuncInfo{
    char *funcname;
    char *srcname;
    char *lineno;
    char *flag;
    unsigned int    uselineno;
}FUNCINFO;



void  ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo);
void GetSubfunctionFromSrcFile(FILE *fp_src,FUNCINFO *pInfo);
char* RepladeTabWithSpace(char* buffer);
unsigned int  GetUseLinenum(char* p);
int getSrcLineNum(FILE *fp_src);
void getcommonhead(FILE * fp_src,FILE * fp_subFunc,FUNCINFO *pInfo);


#endif
----------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "ADSC_FILE.h"


#define MAXNUM 128
#define BLANKSPACE   " "
#define TAB  '\t'
#define USELINENUM 256
#define LINENUM 1024*16
#define SUBFUNCNAMELEN 32


extern unsigned int subFuncNum = 0;

/*         将tags文件中的\t替换为\n         */
char* ReplaceTabWithSpace(char* buffer)
{
    unsigned int nIndex = 0;
    for (nIndex = 0; nIndex < (unsigned int)strlen(buffer); nIndex++)
    {
        if ( buffer[nIndex] == TAB )
        {
            buffer[nIndex] = ' ';
        }
    }
    return buffer;
}

/*        提取行号,并转换为整形数        */
unsigned int  GetUseLinenum( char* p)
{
    unsigned int nIndex = 0;
    char* pRet;
    unsigned int ret = 0;
    pRet = (char*)malloc(strlen(p));
    while( (p[nIndex] >= 0x30) && p[nIndex] <= 0x39)
    {
        pRet[nIndex] = p[nIndex];
        nIndex++;   
    }
    pRet[nIndex] = '\0';
    ret = (unsigned int)atoi(pRet);
    return ret;
}

/* tags文件函数 读取,截取信息,提取行号*/
void  ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo)
{
    char buffer[MAXNUM];
    char srcbuffer[MAXNUM];
    char *buf = NULL;
    int bufferCount = 0;
    int i = 0;
    int k = 0;
    int j = 0;

    int n = 0;

    char *p[4];

    FUNCINFO Info[USELINENUM];

    while((fgets(buffer,MAXNUM,fp_tags)) != NULL )
    {
        /*  delete ! info  */
        if(buffer[0] == '!')
            continue;
        /*  delete V info  */
        bufferCount = strlen(buffer);
        if( buffer[bufferCount - 2] == 'v' )
        {
            continue;
        }

        buf = ReplaceTabWithSpace(buffer);

        /*strtok()分离tags每一行*/
        while((p[i]=strtok(buf,BLANKSPACE)) != NULL)
        {
            i++;
            buf = NULL;   
        }
   
        /*     申请内存        */
        for(int j=0;j<4;j++)
        {
            p[i] = (char*)malloc(SUBFUNCNAMELEN);
                if(p[i] == NULL)
                {
                    printf("mallco error.\n");
                }
        }
            strcpy(Info[k].funcname,p[0]);
            strcpy(Info[k].srcname ,p[1]);
            strcpy(Info[k].lineno  ,p[2]);
            strcpy(Info[k].flag    ,p[3]);   
            Info[k].uselineno = GetUseLinenum(Info[k].lineno);
   
            i = 0;
            k++;        
    }
    subFuncNum = k;
    /*--------测试NO.1-------------*/
    for(n = 0; n < subFuncNum;n++)
    {
        //printf("Info[%d].funcname = %s--%s--%s--%s",n,Info[n].funcname,Info[n].srcname,Info[n].lineno,Info[n].flag);
    }
    printf("%d\n",subFuncNum);

}

/*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
int getSrcLineNum(FILE *fp_src)
{
    char ch;
    int SrcLineNum = 0;
      while((ch = fgetc(fp_src)) != EOF)
     {
        if(ch == '\n')
        {
            SrcLineNum++;
        }
      }
      rewind(fp_src);
        return SrcLineNum;
}

/*      获取公共的头     */
void  getcommonhead(FILE * fp_src,FILE * fp_subFunc,FUNCINFO *pInfo)
{
    int i = 0;
    char buffer[MAXNUM];

        for(i = 0;i < pInfo[0].uselineno - 1;i++)
        {
            fgets(buffer,MAXNUM,fp_src);
            fprintf(fp_subFunc,"%s",buffer);
        }
}

/*   分解源文件获取子函数 */  
void GetSubfunctionFromSrcFile(FILE *fp_src,  FUNCINFO *Info)
{
    char buffer[MAXNUM];
   
    int j = 0;
    int k = 0;
    int n = 0;
    int SrcLineNum = 0;
    char ch;
    char subFuncName[SUBFUNCNAMELEN];

    FILE *fp_subFunc;

    /*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
        SrcLineNum =  getSrcLineNum(fp_src);


        /*    获取前 subFuncNum-1 个子函数    */
            for(k = 0;k < subFuncNum - 1;k++ )
            {
                strcpy(subFuncName,Info[k].funcname);
                strcat(subFuncName,".c");
                fp_subFunc = fopen(subFuncName,"w+");
                    
                /*      获取公共的头     */
                getcommonhead(fp_src, fp_subFunc,Info);
                for(j = Info[k].uselineno;j < Info[k+1].uselineno;j++)
                {
                    fgets(buffer,MAXNUM,fp_src);
                    
                    fprintf(fp_subFunc,"%s",buffer);        
                }
                fclose(fp_subFunc);   
                    
            }

        /*    获取最后一个子函数    */
            strcpy(subFuncName,Info[subFuncNum - 1].funcname);
            strcat(subFuncName,".c");
            fp_subFunc = fopen(subFuncName,"w+");
            for(n = Info[subFuncNum-1].uselineno;n < SrcLineNum+1;n++)
            {
                fgets(buffer,MAXNUM,fp_src);
                fprintf(fp_subFunc,"%s",buffer);
            }
                fclose(fp_subFunc);
        
}

int main()
{
    int i = 0;
    FILE *fp_tags;
    FILE *fp_src;

    FUNCINFO Info[USELINENUM];
    if((fp_tags=fopen("tags","r")) == NULL)
    {
        printf("fopen file error.\n");
    }
    if((fp_src=fopen("fuction.c","r")) == NULL)
    {
        printf("fopen src file error.\n");
    }
   

    /* tags文件函数 读取,截取信息,提取行号*/
    ReadTagsFile(fp_tags, Info);
    //GetSubfunctionFromSrcFile(fp_src,Info);


    /*      释放内存     */
    for(i = 0;i <subFuncNum; i++ )
        {
            free(Info[i].funcname);
            free(Info[i].srcname);
            free(Info[i].lineno);
            free(Info[i].flag);
        }
   
    if(fclose(fp_tags) != 0)
    {
        printf("close tags file error.\n");
    }
    if(fclose(fp_src) != 0)
    {
        printf("close src file error.\n");
    }
   

    return 0;
}
2012-11-30 11:00
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
#ifndef __ADSC_FILE_H__
#define __ADSC_FILE_H__


typedef struct tagFuncInfo{
    char *funcname;
    char *srcname;
    char *lineno;
    char *flag;
    unsigned int    uselineno;
}FUNCINFO;



void  ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo);
void GetSubfunctionFromSrcFile(FILE *fp_src,FUNCINFO *pInfo);
char* RepladeTabWithSpace(char* buffer);
unsigned int  GetUseLinenum(char* p);
int getSrcLineNum(FILE *fp_src);
void getcommonhead(FILE * fp_src,FILE * fp_subFunc,FUNCINFO *pInfo);


#endif
----------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "ADSC_FILE.h"


#define MAXNUM 128
#define BLANKSPACE   " "
#define TAB  '\t'
#define USELINENUM 256
#define LINENUM 1024*16
#define SUBFUNCNAMELEN 32


extern unsigned int subFuncNum = 0;

/*         将tags文件中的\t替换为\n         */
char* ReplaceTabWithSpace(char* buffer)
{
    unsigned int nIndex = 0;
    for (nIndex = 0; nIndex < (unsigned int)strlen(buffer); nIndex++)
    {
        if ( buffer[nIndex] == TAB )
        {
            buffer[nIndex] = ' ';
        }
    }
    return buffer;
}

/*        提取行号,并转换为整形数        */
unsigned int  GetUseLinenum( char* p)
{
    unsigned int nIndex = 0;
    char* pRet;
    unsigned int ret = 0;
    pRet = (char*)malloc(strlen(p));
    while( (p[nIndex] >= 0x30) && p[nIndex] <= 0x39)
    {
        pRet[nIndex] = p[nIndex];
        nIndex++;   
    }
    pRet[nIndex] = '\0';
    ret = (unsigned int)atoi(pRet);
    return ret;
}

/* tags文件函数 读取,截取信息,提取行号*/
void  ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo)
{
    char buffer[MAXNUM];
    char srcbuffer[MAXNUM];
    char *buf = NULL;
    int bufferCount = 0;
    int i = 0;
    int k = 0;
    int j = 0;

    int n = 0;

    char *p[4];

    FUNCINFO Info[USELINENUM];

    while((fgets(buffer,MAXNUM,fp_tags)) != NULL )
    {
        /*  delete ! info  */
        if(buffer[0] == '!')
            continue;
        /*  delete V info  */
        bufferCount = strlen(buffer);
        if( buffer[bufferCount - 2] == 'v' )
        {
            continue;
        }

        buf = ReplaceTabWithSpace(buffer);

        /*strtok()分离tags每一行*/
        while((p[i]=strtok(buf,BLANKSPACE)) != NULL)
        {
            i++;
            buf = NULL;   
        }
   
        /*     申请内存        */
        for(int j=0;j<4;j++)
        {
            p[i] = (char*)malloc(SUBFUNCNAMELEN);
                if(p[i] == NULL)
                {
                    printf("mallco error.\n");
                }
        }
            strcpy(Info[k].funcname,p[0]);
            strcpy(Info[k].srcname ,p[1]);
            strcpy(Info[k].lineno  ,p[2]);
            strcpy(Info[k].flag    ,p[3]);   
            Info[k].uselineno = GetUseLinenum(Info[k].lineno);
   
            i = 0;
            k++;        
    }
    subFuncNum = k;
    /*--------测试NO.1-------------*/
    for(n = 0; n < subFuncNum;n++)
    {
        //printf("Info[%d].funcname = %s--%s--%s--%s",n,Info[n].funcname,Info[n].srcname,Info[n].lineno,Info[n].flag);
    }
    printf("%d\n",subFuncNum);

}

/*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
int getSrcLineNum(FILE *fp_src)
{
    char ch;
    int SrcLineNum = 0;
      while((ch = fgetc(fp_src)) != EOF)
     {
        if(ch == '\n')
        {
            SrcLineNum++;
        }
      }
      rewind(fp_src);
        return SrcLineNum;
}

/*      获取公共的头     */
void  getcommonhead(FILE * fp_src,FILE * fp_subFunc,FUNCINFO *pInfo)
{
    int i = 0;
    char buffer[MAXNUM];

        for(i = 0;i < pInfo[0].uselineno - 1;i++)
        {
            fgets(buffer,MAXNUM,fp_src);
            fprintf(fp_subFunc,"%s",buffer);
        }
}

/*   分解源文件获取子函数 */  
void GetSubfunctionFromSrcFile(FILE *fp_src,  FUNCINFO *Info)
{
    char buffer[MAXNUM];
   
    int j = 0;
    int k = 0;
    int n = 0;
    int SrcLineNum = 0;
    char ch;
    char subFuncName[SUBFUNCNAMELEN];

    FILE *fp_subFunc;

    /*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
        SrcLineNum =  getSrcLineNum(fp_src);


        /*    获取前 subFuncNum-1 个子函数    */
            for(k = 0;k < subFuncNum - 1;k++ )
            {
                strcpy(subFuncName,Info[k].funcname);
                strcat(subFuncName,".c");
                fp_subFunc = fopen(subFuncName,"w+");
                    
                /*      获取公共的头     */
                getcommonhead(fp_src, fp_subFunc,Info);
                for(j = Info[k].uselineno;j < Info[k+1].uselineno;j++)
                {
                    fgets(buffer,MAXNUM,fp_src);
                    
                    fprintf(fp_subFunc,"%s",buffer);        
                }
                fclose(fp_subFunc);   
                    
            }

        /*    获取最后一个子函数    */
            strcpy(subFuncName,Info[subFuncNum - 1].funcname);
            strcat(subFuncName,".c");
            fp_subFunc = fopen(subFuncName,"w+");
            for(n = Info[subFuncNum-1].uselineno;n < SrcLineNum+1;n++)
            {
                fgets(buffer,MAXNUM,fp_src);
                fprintf(fp_subFunc,"%s",buffer);
            }
                fclose(fp_subFunc);
        
}

int main()
{
    int i = 0;
    FILE *fp_tags;
    FILE *fp_src;

    FUNCINFO Info[USELINENUM];
    if((fp_tags=fopen("tags","r")) == NULL)
    {
        printf("fopen file error.\n");
    }
    if((fp_src=fopen("fuction.c","r")) == NULL)
    {
        printf("fopen src file error.\n");
    }
   

    /* tags文件函数 读取,截取信息,提取行号*/
    ReadTagsFile(fp_tags, Info);
    //GetSubfunctionFromSrcFile(fp_src,Info);


    /*      释放内存     */
    for(i = 0;i <subFuncNum; i++ )
        {
            free(Info[i].funcname);
            free(Info[i].srcname);
            free(Info[i].lineno);
            free(Info[i].flag);
        }
   
    if(fclose(fp_tags) != 0)
    {
        printf("close tags file error.\n");
    }
    if(fclose(fp_src) != 0)
    {
        printf("close src file error.\n");
    }
   

    return 0;
}
2012-11-30 11:01
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
刚刚网速有问题 不好意思了
--------
请大家给点建议

内存的问题是我的弱项
2012-11-30 11:03
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
偌大的吧
没人愿意给解决一下
2012-11-30 12:49
jk_love
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:196
专家分:965
注 册:2012-10-22
收藏
得分:20 
这个是啥子意思?  
            strcpy(Info[k].funcname,p[0]);
            strcpy(Info[k].srcname ,p[1]);
            strcpy(Info[k].lineno  ,p[2]);
            strcpy(Info[k].flag    ,p[3]);  
2012-11-30 14:06
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
问题已经解决了
不是内存的问题
是strtok(),这个函数的问题
改为
temp = strtok(buf, BLANKSPACE);
        while (temp != NULL)
        {
            p[i] = temp;
            temp = strtok(NULL, BLANKSPACE);
            i = i + 1;
        }
---
问题就解决了
2012-12-03 16:18
快速回复:明确一下需求 大神看过了,帮忙给点指点 文件读写和内存分配问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022384 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved