精华内容
下载资源
问答
  • 读取十六进制文件(main.hex),并将其按Hex格式规定,对不同格式域进行划分// 将划分后的格式写入main.txt文件,根据Hex格式,对响应的Flash存储单元赋值// 将Flash存储单元写入main_formated.txt中// 请将main.hex...

    // 读取十六进制文件(main.hex),并将其按Hex格式规定,对不同格式域进行划分

    // 将划分后的格式写入main.txt文件,根据Hex格式,对响应的Flash存储单元赋值

    // 将Flash存储单元写入main_formated.txt中

    // 请将main.hex放在改程序的统一目录下

    // 作者:nuaazdh

    // 时间:2012年3月16日 15:57:52

    #include

    #include

    #define FLASHVOLUM 16 //Flash的容量,以K为单位

    void FormatTran(char *dst,const char *src);

    int HexToDec(char *src);

    void TranHex(char *flashbuffer,char *formatcmd,int flashsize);

    void PrintFlash(char *flashbuffer,int flashsize);

    void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize);

    char *ExtraSubStr(const char *src,int startIndex,int len);

    void main()

    {

    FILE *fp;

    FILE *resultfp;

    int flashsize=2*FLASHVOLUM*1024*sizeof(char);//flash的存储单元个数

    char *buffer=malloc(sizeof(char)*100);//存储hex文件的一行内容

    char *trsbuffer=malloc(sizeof(char)*200);//存储hex文件解析后的内容

    char *flashbuffer=malloc(flashsize);//存储Flash中的内容

    if(buffer==NULL||trsbuffer==NULL||flashbuffer==NULL){//申请空间失败

    printf("Apply for memory failed.!\n");

    exit(0);

    }

    memset(flashbuffer,'F',flashsize);//将Flash初始时全部清1

    fp=fopen("main.hex","r");

    resultfp=fopen("main.txt","w");

    if(resultfp==NULL||fp==NULL){//打开文件失败

    printf("Open file error.\n");

    exit(0);

    }

    while(fscanf(fp,"%s",buffer)!=EOF){//读取文件所有内容

    //HextoBin(trsbuffer,buffer);

    printf("%s\n",buffer);//控制台显示

    FormatTran(trsbuffer,buffer);

    //printf("Length:%d\n",strlen(buffer));//显示字符串长度

    fprintf(resultfp,"%s\n",trsbuffer);//写入文件

    TranHex(flashbuffer,buffer,flashsize);

    }

    PrintFlash(flashbuffer,2*1024);//仅显示前2K的内容

    WriteFlashToFile(flashbuffer,"main_formated.txt",2*1024);//将前2K的内容写入文件"main_formated.txt"中

    //释放内存

    free(buffer);

    free(trsbuffer);

    free(flashbuffer);

    //关闭文件

    fclose(fp);

    fclose(resultfp);

    /* //HexToDex()函数测试代码

    char *src=malloc(sizeof(char)*5);

    int value;

    src[0]='2';src[1]='F';src[2]='1';src[3]='F';src[4]='\0';

    value=HexToDec(src);

    printf("The value of the hex string:%d",value);

    */

    /*

    //ExtraSubStr()函数测试代码

    char *src=":10003000758180121086D2A400000000C2A40000C6";

    char *substr;

    substr=ExtraSubStr(src,1,2);

    printf("SubString:%s\n",substr);

    printf("Change to Number:%d",HexToDec(substr));

    */

    }

    void TranHex(char *flashbuffer,char *formatcmd,int flashsize){

    //按formatcmd字符串描述,以hex文件格式修改flashbuffer中的存储单元

    //如 formatcmd=":03000000020030CB"

    //则将flahsbuffer中以"0000"开始的连续"03"个内存单元,内容为"020030"

    //flashsize:表示flash的存储单元个数

    char *eofstring=":00000001FF";

    int startadd;//formatcmd指示的起始地址

    int count;//formatcmd指示的数据单元个数

    int p,q;//索引指针

    if(strcmp(formatcmd,eofstring)==0){//结束标志

    printf("End of file.\n");

    return;

    }

    if(formatcmd[0]!=':'){//不是以":"开始

    printf("Format wrong!\n");

    return;

    }

    if(strlen(formatcmd)<11){//字符串长度小于11

    printf("Format wrong!\n");

    return;

    }

    count=HexToDec(ExtraSubStr(formatcmd,1,2));//获得数据单元长度

    startadd=2*HexToDec(ExtraSubStr(formatcmd,3,4));//获得起始地址

    if(strlen(formatcmd)<11+count*2){//字符串中数据损坏(丢失)

    printf("File has been damaged!\n");

    return;

    }

    for(p=0;p

    flashbuffer[startadd+p]=formatcmd[9+p];

    }

    }

    void FormatTran(char *dst,const char *src){

    //格式解析,将一行Hex文件字符串src,按Hex文件组织格式

    //划分出不同的块,块之间通过空格隔开

    // ":llaaaatt[dd]cc"

    // ":"行开始标志;"ll"数据长度;"aaaa"起始地址;"tt"数据类型;"dd"数据;"cc"校验

    //解析后为:": ll aaaa tt [dd] cc"

    int srclen=strlen(src);

    //printf("Length of src:%d",srclen);

    int p=0,q=0;//索引,p为src的索引,q为dst索引

    int i;//循环标志

    while(p<=srclen){//循环,对src按格式解析

    if(p==0){

    if(src[p]!=':'){//是否以":"开始

    printf("Format wrong! Please check the format of the file.\n");

    break;

    }

    else{

    dst[q++]=':';dst[q++]=' ';

    p++;continue;

    }

    }

    if(p==1){

    for(i=0;i<2;i++){//提取两位的"ll"

    dst[q++]=src[p++];

    }

    dst[q++]=' ';continue;

    }

    if(p==3){

    for(i=0;i<4;i++){//提取四位的"aaaa"

    dst[q++]=src[p++];

    }

    dst[q++]=' ';continue;

    }

    if(p==7){

    for(i=0;i<2;i++){//提取两位的"tt"

    dst[q++]=src[p++];

    }

    dst[q++]=' ';continue;

    }

    for(i=0;i<2;i++){//将dst的数据位以两个为一组,用空格隔开

    dst[q++]=src[p++];

    }

    dst[q++]=' ';

    }

    dst[q]='\0';//结束标志

    }

    int HexToDec(char *src){

    //将src中的无符号十六进制字符串转为十进制数

    //如src="001A",则返回26

    //字符串src需要以'\0'作为结束标志

    int value=0,srclen=strlen(src);

    int i;

    for(i=0;i

    if(src[i]<='9'&&src[i]>='0'){

    value=value*16+(int)(src[i]-'0');

    }

    else if(src[i]<='f'&&src[i]>='a'){

    value=value*16+(int)(src[i]-'a'+10);

    }else{

    value=value*16+(int)(src[i]-'A'+10);

    }

    }

    return value;//返回转换后的数值

    }

    char *ExtraSubStr(const char *src,int startIndex,int len){

    //提取子串,从src中提取自startIndex开始的连续len个字节,构成子串

    char *substr=malloc(sizeof(char)*(len+1));

    int i=0;

    if(substr==NULL){

    printf("Apply for memory failed.\n");

    return NULL;

    }

    if(strlen(src)

    printf("Index exceeds bounds.\n");

    return NULL;

    }

    for(i=0;i

    substr[i]=src[startIndex+i];

    }

    substr[len]='\0';//添加字符串末尾标志

    return substr;

    }

    void PrintFlash(char *flashbuffer,int flashsize){

    //flashbuffer:内存单元指针;flashsize:flash存储单元个数,即字节数

    //输出Flash中的内容

    int rowlen=16;//每行16个字节

    int i,j;

    printf("Flash:%d\n",flashsize);

    for(i=0;i

    if((i/2)%(rowlen)==0){

    printf("\n%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)

    }

    printf("%c%c ",flashbuffer[i],flashbuffer[i+1]);

    }

    }

    void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize){

    //将Flash的内容写入文件中

    //flashbuffer:内存单元指针;filename:要写入的文件文件名;

    //flashsize:写入的长度,以字节计

    FILE *fp;

    int i,rowlen=16;

    if((fp=fopen(filename,"w"))==NULL){

    printf("Open file error.\n");

    exit(0);

    }

    //开始写入

    for(i=0;i

    if((i/2)%(rowlen)==0){

    if(i!=0){//不是第一行,遇到写满16个单元换行

    fprintf(fp,"\n");

    }

    fprintf(fp,"%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)

    }

    fprintf(fp,"%c%c ",flashbuffer[i],flashbuffer[i+1]);

    }

    fclose(fp);

    }

    原Hex文件内容:

    0_1331963357ioUU.gif

    去除Hex格式后,得到响应Flash存储单元中的内容:

    0_1331963368ttzj.gif

    展开全文
  • c语言读取指定目录下所有文件,怎么搞?
  • 例如在目录下面有文件:1.txt 2.txt 3.txt 1.txt内容为: ----------------------- ...需要将这个目录下面这些txt文件的内容读取到一个txt文件中。注意考虑多个txt文件的情况 希望懂的朋友解答,非常感谢!!!
  • C语言 C语言读取十六进制文件.hex

    千次阅读 2014-08-29 10:50:22
     // 读取十六进制文件(main.hex),并将其按Hex格式规定,对不同格式域进行划分 // 将划分后的格式写入main....请将main.hex放在改程序的统一目录下 // 作者:nuaazdh // 时间:2012年3月16日 15:57:5
    
    1. // 读取十六进制文件(main.hex),并将其按Hex格式规定,对不同格式域进行划分  
    2. // 将划分后的格式写入main.txt文件,根据Hex格式,对响应的Flash存储单元赋值  
    3. // 将Flash存储单元写入main_formated.txt中  
    4. // 请将main.hex放在改程序的统一目录下  
    5. // 作者:nuaazdh  
    6. // 时间:2012年3月16日 15:57:52  
    7. #include <stdio.h>  
    8. #include <stdlib.h>  
    9. #define FLASHVOLUM 16   //Flash的容量,以K为单位  
    10.   
    11. void FormatTran(char *dst,const char *src);  
    12. int HexToDec(char *src);  
    13. void TranHex(char *flashbuffer,char *formatcmd,int flashsize);  
    14. void PrintFlash(char *flashbuffer,int flashsize);  
    15. void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize);  
    16. char *ExtraSubStr(const char *src,int startIndex,int len);  
    17. void main()  
    18. {  
    19.     FILE *fp;  
    20.     FILE *resultfp;  
    21.     int  flashsize=2*FLASHVOLUM*1024*sizeof(char);//flash的存储单元个数  
    22.     char *buffer=malloc(sizeof(char)*100);//存储hex文件的一行内容  
    23.     char *trsbuffer=malloc(sizeof(char)*200);//存储hex文件解析后的内容  
    24.     char *flashbuffer=malloc(flashsize);//存储Flash中的内容  
    25.     if(buffer==NULL||trsbuffer==NULL||flashbuffer==NULL){//申请空间失败  
    26.         printf("Apply for memory failed.!\n");  
    27.         exit(0);  
    28.     }  
    29.     memset(flashbuffer,'F',flashsize);//将Flash初始时全部清1  
    30.     fp=fopen("main.hex","r");  
    31.     resultfp=fopen("main.txt","w");  
    32.     if(resultfp==NULL||fp==NULL){//打开文件失败  
    33.         printf("Open file error.\n");  
    34.         exit(0);  
    35.     }  
    36.     while(fscanf(fp,"%s",buffer)!=EOF){//读取文件所有内容  
    37.         //HextoBin(trsbuffer,buffer);  
    38.         printf("%s\n",buffer);//控制台显示  
    39.         FormatTran(trsbuffer,buffer);  
    40.         //printf("Length:%d\n",strlen(buffer));//显示字符串长度  
    41.         fprintf(resultfp,"%s\n",trsbuffer);//写入文件  
    42.         TranHex(flashbuffer,buffer,flashsize);  
    43.     }  
    44.     PrintFlash(flashbuffer,2*1024);//仅显示前2K的内容  
    45.     WriteFlashToFile(flashbuffer,"main_formated.txt",2*1024);//将前2K的内容写入文件"main_formated.txt"中  
    46.     //释放内存  
    47.     free(buffer);  
    48.     free(trsbuffer);  
    49.     free(flashbuffer);  
    50.     //关闭文件  
    51.     fclose(fp);  
    52.     fclose(resultfp);  
    53.   
    54.   
    55. /*  //HexToDex()函数测试代码 
    56.     char *src=malloc(sizeof(char)*5); 
    57.     int value; 
    58.     src[0]='2';src[1]='F';src[2]='1';src[3]='F';src[4]='\0'; 
    59.     value=HexToDec(src); 
    60.     printf("The value of the hex string:%d",value); 
    61. */  
    62. /* 
    63.     //ExtraSubStr()函数测试代码 
    64.     char *src=":10003000758180121086D2A400000000C2A40000C6"; 
    65.     char *substr; 
    66.     substr=ExtraSubStr(src,1,2); 
    67.     printf("SubString:%s\n",substr); 
    68.     printf("Change to Number:%d",HexToDec(substr)); 
    69. */  
    70. }  
    71.   
    72. void TranHex(char *flashbuffer,char *formatcmd,int flashsize){  
    73.     //按formatcmd字符串描述,以hex文件格式修改flashbuffer中的存储单元  
    74.     //如 formatcmd=":03000000020030CB"  
    75.     //则将flahsbuffer中以"0000"开始的连续"03"个内存单元,内容为"020030"  
    76.     //flashsize:表示flash的存储单元个数  
    77.     char *eofstring=":00000001FF";  
    78.     int startadd;//formatcmd指示的起始地址  
    79.     int count;//formatcmd指示的数据单元个数  
    80.     int p,q;//索引指针  
    81.     if(strcmp(formatcmd,eofstring)==0){//结束标志  
    82.         printf("End of file.\n");  
    83.         return;  
    84.     }  
    85.     if(formatcmd[0]!=':'){//不是以":"开始  
    86.         printf("Format wrong!\n");  
    87.         return;  
    88.     }  
    89.     if(strlen(formatcmd)<11){//字符串长度小于11  
    90.         printf("Format wrong!\n");  
    91.         return;  
    92.     }  
    93.     count=HexToDec(ExtraSubStr(formatcmd,1,2));//获得数据单元长度  
    94.     startadd=2*HexToDec(ExtraSubStr(formatcmd,3,4));//获得起始地址  
    95.     if(strlen(formatcmd)<11+count*2){//字符串中数据损坏(丢失)  
    96.         printf("File has been damaged!\n");  
    97.         return;  
    98.     }  
    99.     for(p=0;p<count*2;p++){  
    100.         flashbuffer[startadd+p]=formatcmd[9+p];  
    101.     }  
    102. }  
    103.   
    104. void FormatTran(char *dst,const char *src){  
    105.     //格式解析,将一行Hex文件字符串src,按Hex文件组织格式  
    106.     //划分出不同的块,块之间通过空格隔开  
    107.     // ":llaaaatt[dd]cc"  
    108.     // ":"行开始标志;"ll"数据长度;"aaaa"起始地址;"tt"数据类型;"dd"数据;"cc"校验  
    109.     //解析后为:": ll aaaa tt [dd] cc"  
    110.     int srclen=strlen(src);  
    111.     //printf("Length of src:%d",srclen);  
    112.     int p=0,q=0;//索引,p为src的索引,q为dst索引  
    113.     int i;//循环标志  
    114.     while(p<=srclen){//循环,对src按格式解析  
    115.         if(p==0){  
    116.             if(src[p]!=':'){//是否以":"开始  
    117.                 printf("Format wrong! Please check the format of the file.\n");  
    118.                 break;  
    119.             }  
    120.             else{  
    121.                 dst[q++]=':';dst[q++]=' ';  
    122.                 p++;continue;  
    123.             }  
    124.         }  
    125.         if(p==1){  
    126.             for(i=0;i<2;i++){//提取两位的"ll"  
    127.                 dst[q++]=src[p++];  
    128.             }  
    129.             dst[q++]=' ';continue;  
    130.         }  
    131.         if(p==3){  
    132.             for(i=0;i<4;i++){//提取四位的"aaaa"  
    133.                 dst[q++]=src[p++];  
    134.             }  
    135.             dst[q++]=' ';continue;  
    136.         }  
    137.         if(p==7){  
    138.             for(i=0;i<2;i++){//提取两位的"tt"  
    139.                 dst[q++]=src[p++];  
    140.             }  
    141.             dst[q++]=' ';continue;  
    142.         }  
    143.         for(i=0;i<2;i++){//将dst的数据位以两个为一组,用空格隔开  
    144.                 dst[q++]=src[p++];  
    145.         }  
    146.         dst[q++]=' ';  
    147.     }  
    148.     dst[q]='\0';//结束标志  
    149. }  
    150.   
    151. int HexToDec(char *src){  
    152.     //将src中的无符号十六进制字符串转为十进制数  
    153.     //如src="001A",则返回26  
    154.     //字符串src需要以'\0'作为结束标志  
    155.     int value=0,srclen=strlen(src);  
    156.     int i;  
    157.     for(i=0;i<srclen;i++){  
    158.         if(src[i]<='9'&&src[i]>='0'){  
    159.             value=value*16+(int)(src[i]-'0');  
    160.         }  
    161.         else if(src[i]<='f'&&src[i]>='a'){  
    162.             value=value*16+(int)(src[i]-'a'+10);  
    163.         }else{  
    164.             value=value*16+(int)(src[i]-'A'+10);  
    165.         }  
    166.     }  
    167.     return value;//返回转换后的数值  
    168. }  
    169.   
    170. char *ExtraSubStr(const char *src,int startIndex,int len){  
    171.     //提取子串,从src中提取自startIndex开始的连续len个字节,构成子串  
    172.     char *substr=malloc(sizeof(char)*(len+1));  
    173.     int i=0;  
    174.     if(substr==NULL){  
    175.         printf("Apply for memory failed.\n");  
    176.         return NULL;  
    177.     }  
    178.     if(strlen(src)<startIndex+len){  
    179.         printf("Index exceeds bounds.\n");  
    180.         return NULL;  
    181.     }  
    182.     for(i=0;i<len;i++){//提取子串  
    183.         substr[i]=src[startIndex+i];  
    184.     }  
    185.     substr[len]='\0';//添加字符串末尾标志  
    186.     return substr;  
    187. }  
    188.   
    189. void PrintFlash(char *flashbuffer,int flashsize){  
    190.     //flashbuffer:内存单元指针;flashsize:flash存储单元个数,即字节数  
    191.     //输出Flash中的内容  
    192.     int rowlen=16;//每行16个字节  
    193.     int i,j;  
    194.     printf("Flash:%d\n",flashsize);  
    195.     for(i=0;i<flashsize;i+=2){  
    196.         if((i/2)%(rowlen)==0){  
    197.             printf("\n%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)  
    198.         }  
    199.         printf("%c%c ",flashbuffer[i],flashbuffer[i+1]);  
    200.     }  
    201. }  
    202.   
    203. void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize){  
    204.     //将Flash的内容写入文件中  
    205.     //flashbuffer:内存单元指针;filename:要写入的文件文件名;  
    206.     //flashsize:写入的长度,以字节计  
    207.     FILE *fp;  
    208.     int i,rowlen=16;  
    209.     if((fp=fopen(filename,"w"))==NULL){  
    210.         printf("Open file error.\n");  
    211.         exit(0);  
    212.     }  
    213.     //开始写入  
    214.     for(i=0;i<flashsize;i+=2){  
    215.         if((i/2)%(rowlen)==0){  
    216.             if(i!=0){//不是第一行,遇到写满16个单元换行  
    217.                 fprintf(fp,"\n");  
    218.             }  
    219.             fprintf(fp,"%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)  
    220.         }  
    221.         fprintf(fp,"%c%c ",flashbuffer[i],flashbuffer[i+1]);  
    222.     }  
    223.     fclose(fp);  
    224. }  
    225. // 读取十六进制文件(main.hex),并将其按Hex格式规定,对不同格式域进行划分
      // 将划分后的格式写入main.txt文件,根据Hex格式,对响应的Flash存储单元赋值
      // 将Flash存储单元写入main_formated.txt中
      // 请将main.hex放在改程序的统一目录下
      // 作者:nuaazdh
      // 时间:2012年3月16日 15:57:52
      #include <stdio.h>
      #include <stdlib.h>
      #define FLASHVOLUM 16   //Flash的容量,以K为单位
      
      void FormatTran(char *dst,const char *src);
      int HexToDec(char *src);
      void TranHex(char *flashbuffer,char *formatcmd,int flashsize);
      void PrintFlash(char *flashbuffer,int flashsize);
      void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize);
      char *ExtraSubStr(const char *src,int startIndex,int len);
      void main()
      {
          FILE *fp;
          FILE *resultfp;
          int  flashsize=2*FLASHVOLUM*1024*sizeof(char);//flash的存储单元个数
          char *buffer=malloc(sizeof(char)*100);//存储hex文件的一行内容
          char *trsbuffer=malloc(sizeof(char)*200);//存储hex文件解析后的内容
          char *flashbuffer=malloc(flashsize);//存储Flash中的内容
          if(buffer==NULL||trsbuffer==NULL||flashbuffer==NULL){//申请空间失败
              printf("Apply for memory failed.!\n");
              exit(0);
          }
          memset(flashbuffer,'F',flashsize);//将Flash初始时全部清1
          fp=fopen("main.hex","r");
          resultfp=fopen("main.txt","w");
          if(resultfp==NULL||fp==NULL){//打开文件失败
              printf("Open file error.\n");
              exit(0);
          }
          while(fscanf(fp,"%s",buffer)!=EOF){//读取文件所有内容
              //HextoBin(trsbuffer,buffer);
              printf("%s\n",buffer);//控制台显示
              FormatTran(trsbuffer,buffer);
              //printf("Length:%d\n",strlen(buffer));//显示字符串长度
              fprintf(resultfp,"%s\n",trsbuffer);//写入文件
              TranHex(flashbuffer,buffer,flashsize);
          }
          PrintFlash(flashbuffer,2*1024);//仅显示前2K的内容
          WriteFlashToFile(flashbuffer,"main_formated.txt",2*1024);//将前2K的内容写入文件"main_formated.txt"中
          //释放内存
          free(buffer);
          free(trsbuffer);
          free(flashbuffer);
          //关闭文件
          fclose(fp);
          fclose(resultfp);
      
      
      /*  //HexToDex()函数测试代码
          char *src=malloc(sizeof(char)*5);
          int value;
          src[0]='2';src[1]='F';src[2]='1';src[3]='F';src[4]='\0';
          value=HexToDec(src);
          printf("The value of the hex string:%d",value);
      */
      /*
          //ExtraSubStr()函数测试代码
          char *src=":10003000758180121086D2A400000000C2A40000C6";
          char *substr;
          substr=ExtraSubStr(src,1,2);
          printf("SubString:%s\n",substr);
          printf("Change to Number:%d",HexToDec(substr));
      */
      }
      
      void TranHex(char *flashbuffer,char *formatcmd,int flashsize){
          //按formatcmd字符串描述,以hex文件格式修改flashbuffer中的存储单元
          //如 formatcmd=":03000000020030CB"
          //则将flahsbuffer中以"0000"开始的连续"03"个内存单元,内容为"020030"
          //flashsize:表示flash的存储单元个数
          char *eofstring=":00000001FF";
          int startadd;//formatcmd指示的起始地址
          int count;//formatcmd指示的数据单元个数
          int p,q;//索引指针
          if(strcmp(formatcmd,eofstring)==0){//结束标志
              printf("End of file.\n");
              return;
          }
          if(formatcmd[0]!=':'){//不是以":"开始
              printf("Format wrong!\n");
              return;
          }
          if(strlen(formatcmd)<11){//字符串长度小于11
              printf("Format wrong!\n");
              return;
          }
          count=HexToDec(ExtraSubStr(formatcmd,1,2));//获得数据单元长度
          startadd=2*HexToDec(ExtraSubStr(formatcmd,3,4));//获得起始地址
          if(strlen(formatcmd)<11+count*2){//字符串中数据损坏(丢失)
              printf("File has been damaged!\n");
              return;
          }
          for(p=0;p<count*2;p++){
              flashbuffer[startadd+p]=formatcmd[9+p];
          }
      }
      
      void FormatTran(char *dst,const char *src){
          //格式解析,将一行Hex文件字符串src,按Hex文件组织格式
          //划分出不同的块,块之间通过空格隔开
          // ":llaaaatt[dd]cc"
          // ":"行开始标志;"ll"数据长度;"aaaa"起始地址;"tt"数据类型;"dd"数据;"cc"校验
          //解析后为:": ll aaaa tt [dd] cc"
          int srclen=strlen(src);
          //printf("Length of src:%d",srclen);
          int p=0,q=0;//索引,p为src的索引,q为dst索引
          int i;//循环标志
          while(p<=srclen){//循环,对src按格式解析
              if(p==0){
                  if(src[p]!=':'){//是否以":"开始
                      printf("Format wrong! Please check the format of the file.\n");
                      break;
                  }
                  else{
                      dst[q++]=':';dst[q++]=' ';
                      p++;continue;
                  }
              }
              if(p==1){
                  for(i=0;i<2;i++){//提取两位的"ll"
                      dst[q++]=src[p++];
                  }
                  dst[q++]=' ';continue;
              }
              if(p==3){
                  for(i=0;i<4;i++){//提取四位的"aaaa"
                      dst[q++]=src[p++];
                  }
                  dst[q++]=' ';continue;
              }
              if(p==7){
                  for(i=0;i<2;i++){//提取两位的"tt"
                      dst[q++]=src[p++];
                  }
                  dst[q++]=' ';continue;
              }
              for(i=0;i<2;i++){//将dst的数据位以两个为一组,用空格隔开
                      dst[q++]=src[p++];
              }
              dst[q++]=' ';
          }
          dst[q]='\0';//结束标志
      }
      
      int HexToDec(char *src){
          //将src中的无符号十六进制字符串转为十进制数
          //如src="001A",则返回26
          //字符串src需要以'\0'作为结束标志
          int value=0,srclen=strlen(src);
          int i;
          for(i=0;i<srclen;i++){
              if(src[i]<='9'&&src[i]>='0'){
                  value=value*16+(int)(src[i]-'0');
              }
              else if(src[i]<='f'&&src[i]>='a'){
                  value=value*16+(int)(src[i]-'a'+10);
              }else{
                  value=value*16+(int)(src[i]-'A'+10);
              }
          }
          return value;//返回转换后的数值
      }
      
      char *ExtraSubStr(const char *src,int startIndex,int len){
          //提取子串,从src中提取自startIndex开始的连续len个字节,构成子串
          char *substr=malloc(sizeof(char)*(len+1));
          int i=0;
          if(substr==NULL){
              printf("Apply for memory failed.\n");
              return NULL;
          }
          if(strlen(src)<startIndex+len){
              printf("Index exceeds bounds.\n");
              return NULL;
          }
          for(i=0;i<len;i++){//提取子串
              substr[i]=src[startIndex+i];
          }
          substr[len]='\0';//添加字符串末尾标志
          return substr;
      }
      
      void PrintFlash(char *flashbuffer,int flashsize){
          //flashbuffer:内存单元指针;flashsize:flash存储单元个数,即字节数
          //输出Flash中的内容
          int rowlen=16;//每行16个字节
          int i,j;
          printf("Flash:%d\n",flashsize);
          for(i=0;i<flashsize;i+=2){
              if((i/2)%(rowlen)==0){
                  printf("\n%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)
              }
              printf("%c%c ",flashbuffer[i],flashbuffer[i+1]);
          }
      }
      
      void WriteFlashToFile(char *flashbuffer,char *filename,int flashsize){
          //将Flash的内容写入文件中
          //flashbuffer:内存单元指针;filename:要写入的文件文件名;
          //flashsize:写入的长度,以字节计
          FILE *fp;
          int i,rowlen=16;
          if((fp=fopen(filename,"w"))==NULL){
              printf("Open file error.\n");
              exit(0);
          }
          //开始写入
          for(i=0;i<flashsize;i+=2){
              if((i/2)%(rowlen)==0){
                  if(i!=0){//不是第一行,遇到写满16个单元换行
                      fprintf(fp,"\n");
                  }
                  fprintf(fp,"%06X\t",i/2);//内存单元地址输出格式:6位十六进制(A~F大写)
              }
              fprintf(fp,"%c%c ",flashbuffer[i],flashbuffer[i+1]);
          }
          fclose(fp);
      }
      


    原Hex文件内容:



    去除Hex格式后,得到响应Flash存储单元中的内容:

    展开全文
  • C语言读取目录中的文件名的方法

    千次阅读 2013-03-06 17:59:49
    分类: C/C++ 用C语言读取目录中的文件名的方法 ...一,如果是在window环境下,很简单,可以用一下方法: ...使用stdlib.h头文件声明的system()函数 ..._CRTIMP int __cdecl system...调用系统命令dir,把c:目录下文件

    分类: C/C++

    用C语言读取目录中的文件名的方法
    一,如果是在window环境下,很简单,可以用一下方法:
    使用stdlib.h头文件声明的system()函数
    _CRTIMP int __cdecl system (const char*);
    system("dir c:\\ /a:h /b > c:\\dir.txt"); 
    调用系统命令dir,把c:目录下文件列表写入文件dir.txt中

    二,使用dirent.h头文件中声明的opendir(),readdir()函数
    示例代码:

    点击(此处)折叠或打开

    1. int main(int argc, char *argv[])
    2. { 
    3.   DIR *directory_pointer; 
    4.     struct dirent *entry; 
    5.    
    6.     if((directory_pointer=opendir("d:\\XL"))==NULL) 
    7.         printf( "Error opening \n "); 
    8.     else 
    9.     { 
    10.         while((entry=readdir(directory_pointer))!=NULL) 
    11.         { 
    12.           printf("%s\n",entry-> d_name);
    13.         } 
    14.         closedir(directory_pointer); 
    15.        
    16.     }

    17.   system("PAUSE");
    18.  return 0;
    19. }

    三,如果没有dirent.h,可以使用io.h头文件中声明的_findfirst(),_findnext()函数
    示例代码:

    点击(此处)折叠或打开

    1. int main(int argc, char *argv[])
    2. {
    3.   long file;
    4.     struct _finddata_t find;
    5.     
    6.      _chdir("d:\\");
    7.      if((file=_findfirst("*.*", &find))==-1L)
    8.   {
    9.       printf("空白!\n");
    10.      exit(0);
    11.      }
    12.      printf("%s\n", find.name);
    13.      while(_findnext(file, &find)==0)
    14.      {
    15.           printf("%s\n", find.name);
    16.      }
    17.      _findclose(file);
    18.   
    19.   system("PAUSE");
    20.      return 0;
    21. }
    展开全文
  •   在VS中使用CMake编译openCV生成库文件后,需要手动添加附加依赖项,但lib文件太多,不想手动一个一个添加,而希望能够自动生成一个txt文件,该文件包含此目录下所有lib类型文件的文件名。 实现代码 // 操作...

    C语言:读取文件目录下所有特定类型的文件名


    一、实现目标

      输入:所要读取的文件目录和文件类型
      输出:在此目录下,所有符合类型的文件的文件名。

    二、实现背景

      在VS中使用CMake编译openCV生成库文件后,需要手动添加附加依赖项,但lib文件太多,不想手动一个一个添加,而希望能够自动生成一个txt文件,该文件包含此目录下所有lib类型文件的文件名。

    三、实现代码

    // 操作系统:windows 7
    // 编译软件:Dev-C++
    // 编程语言:c语言
    
    #include <stdio.h>
    #include <io.h>
    
    // 使用前需要修改 catalog, type
    char catalog[150] = "D:\\opencv345\\opencv\\build\\x86\\vc15\\staticlib";  //文件目录
    char type[20] = "lib" ;  //文件类型
     
     
    int main()
    {
    	FILE *fp;
    	long handle;    //句柄
    	struct _finddata_t fileinfo;   //文件信息结构体
    	
    	char save[150];  //保存文件地址 
    	strcpy(save, catalog);
    	strcat(save, "\\\\result.txt"); // save = D:\\opencv345\\opencv\\build\\x86\\vc15\\staticlib\\result.txt
    	
    	char search[150];  //欲查找的文件,支持通配符
    	strcpy(search, catalog);
    	strcat(search, "\\\\*.");
    	strcat(search, type);  // search = D:\\opencv345\\opencv\\build\\x86\\vc15\\staticlib\\*.lib
    	
    	fp = fopen(save, "w+");  // 打开文件 
    	if (fp==0) 
    	{
    		printf("文件打开失败!\n");
    		return 0;
    	}
    	
    	handle=_findfirst(search,&fileinfo);    //第一次查找
    	if(-1==handle)
    	{
    		fclose(fp);
    		printf("未找到所需文件。\n");
    		return -1;
    	}
    	
    	fprintf(fp,"%s\n",fileinfo.name);   //打印出找到的文件的文件名
    	while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,直到找不到其他的为止
    	{
    		fprintf(fp,"%s\n",fileinfo.name);
    	}
    	_findclose(handle); //关闭句柄
    	
    	printf("查找成功。\n");
    	fclose(fp);
    	return 0;
    
    }
    

    四、运行结果


    五、参考资料

    C语言获取文件夹内所有文件名并打印到txt中

    展开全文
  • C语言下读取系统文件

    2017-04-26 13:23:52
    测试发现 python等等的脚本都是可以读取系统目录下文件的 但C却不可以 system32 syswow64下某些文件 可通过例如C:\\Windows\\SysNative\\inetsrv\\config\\applicationHost.config 指定路径读取 这里要提到...
  • C语言读取BITMAP文件,此源码默认读取当前目录下的1.bmp。可以改成处理其他BMP文件
  • C语言 读取文件内容

    2020-07-11 19:44:35
    运行前请将代码文件和要读取文件放在同一目录下。 #include <stdio.h> int main(void){ int ch; FILE *fp; char fname[FILENAME_MAX]; printf("文件名:"); scanf("%s", fname); if((fp = fopen...
  • C语言遍历目录文件

    2019-10-19 21:32:26
    使用C语言的 opendir、readdir 函数读取遍历指定目录下的指定类型的文件
  • /** ...*运行此文件,在同目录下存放一个名为dog.bmp的图片,格式必须为bmp */ #include #include #define BMPTYPE 19778 bool isBMP(FILE *F); int multiply_2(int i); void HeaderPartLenght(FI
  • C语言读取txt文件并统计字符数

    千次阅读 2020-03-30 21:32:06
    在源文件目录下读取test.txt文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 1024 int main(void){ char buf[MAX_NUM]; //字符缓冲区 FILE *fp; ...
  • 利用Linux命令获取当前目录下文件和子目录名称,然后传递给C语言程序 由C语言程序对其进行排序,然后输出 相关知识: 1. dirent.h LINUX系统下的一个头文件,在这个目录下/usr/include,为了获取某文件夹...
  • 遍历目录并读取目录下的所有文件,这个功能经常用,也简单,很多年前就看过网上的代码,感觉写复杂了,而且还浪费栈,发文的人说会“爆栈”(而且还不是一个人)。当时看到那些代码就觉得写的不好,不过觉得无关痛痒...
  • 利用Linux命令获取当前目录下文件和子目录名称,然后传递给C语言程序 由C语言程序对其进行排序,然后输出 相关知识: 1. dirent.h LINUX系统下的一个头文件,在这个目录下/usr/include,为了获取某文件夹目录内容...
  • Linux遍历目录搜索文件源程序以及执行文件,支持嵌套目录,输出目录、子目录和对应的子目录中的文件列表,以及总文件数目。 LINUX历遍目录的方法一般是这样的:打开目录-》读取-》关闭目录 相关函数是opendir -> ...
  • 文章目录C语言 生成随机数存入文件读取文件数字的bug背景介绍问题解决方法 背景介绍 先介绍背景: 我现在分别生成10000个,30000个,50000个随机数,将其存入txt文件中,分别命名为1w,3w,5w。 函数分别命名为...
  • #include #include int main(int argc, char *argv[]) { struct _finddata_t fa; long fHandle; if( (fHandle=_findfirst( "*.txt", &fa ))==-1L )//这里... printf( "当前目录下没有txt文件\n"); return 0
  •  由于要批量处理服务器日志,但是对python、perl等脚本不熟悉,就考虑是否可以用c实现,找到了readdir这个库,但是这个不是ANSI C的东西,在windows一般用不起,用linux的可以看看,很简单的代码实现,就没加...
  • C语言实现读取FAT12文件系统

    万次阅读 热门讨论 2013-04-07 18:58:26
    假设要读取的FAT12文件系统的映像文件为跟程序在同一目录下的 a.img : /*文件名不支持中文及符号。*/ #include #include #include typedef unsigned char u8; //1字节 typedef unsigned short u16; //2字节 ...
  • FAT12模拟-C语言读取

    2020-04-01 23:48:58
    介绍 之前详细介绍了FAT12文件系统 其中涉及到过多位运算的时间处理问题,我在另一篇文章中进行了分析。...友情提示:做实验可以先把代码copy下来,把代码和DOS的镜像放在同一目录下运行一下,感受DOS的...
  • #include <...int ReadDir(char *path) //读取文件 { DIR *dir; char pathname[255]; //目录的全名,=当前目录名+子目录名 if((dir = opendir(path))==0) //无法打开则跳过 { printf
  • 文件读取 C语言

    2013-06-12 15:25:00
    fopen函数用来打开一个文件,其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);其中,“文件指针名”必须是被说明为FILE 类型的指针变量;...其意义是在当前目录下打开文件file a,只允许进...
  • 有错误发生或读取目录文件尾则返回NULL. 附加说明:EBADF 参数dir 为无效的目录流。 函数说明:readdir()返回参数dir 目录流的目录进入点。结构dirent 定义如下: struct dirent { ino_t d_ino;...
  • Linux 下C语言文件-目录基本操作

    千次阅读 2012-10-31 16:19:42
    仅提供大概参考~ 纯手写未调试/** *编写一个程序,提供一个...*读取并显示该文件的属性/状态信息 *创建该该文件的一个拷贝 *如果对应目录名存在 *显示该目录及其子目录结构 **/ #include #include #include #includ
  • C语言——文件读取fopen

    千次阅读 2015-01-05 11:01:39
    fopen()函数的参数说明 格式:文件指针名=fopen..."qwe.txt" 和程序在同一目录下的qwe.txt 文件使用方式 意 义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写
  • Linux下读取文件内容存放到数组中(C语言实现) 具体使用函数FILE *fopen(const char *path,const char *mode);...其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。 下面代码为具...
  • 【问题描述】 文学研究人员需要统计某篇文章中某些词的出现次数。试写一个实现这一目标的文字统计...与程序放在同一目录下的记事本文件xxx.txt,内容如下“某日,一个大学老师提问学生,树上有十只鸟,开枪打死一只,还
  • 系统是ubuntu,当u盘插入的时候 ,系统会在/dev 目录下面多出一个 scsi 设备文件, 类似于 /dev/sdb 像这种块设备文件。 我用c语言识别它是U盘,并且用linux C open(),write(),read(),函数读写 /dev/sdb,大致情况 ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 255
精华内容 102
关键字:

c语言读取目录下文件

c语言 订阅