C文件处理相关

1、main函数的两个参数

 main函数中两个参数的含义

1 int main(int argc, char *argv[])
2 
3 {
4 
5   ...
6 
7 }
第一个参数argc是总共参数的个数(不包括自己);
第二个参数*argv[]是输入参数,其中argv[0]是生成的.exe文件的地址,argv[1]是输入的第一个参数,以此类推。
 
如:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
  printf("%d\n",argc);
  printf("%s\n",argv[0]);
  printf("%s\n", argv[1]);
  return 0;
}
输入:asds asf dd
输出:
4
C:\Users\samni\Desktop\TestError\TestError\Debug\TestError.exe
asds
 
2、fopen()  fclose()  fgets()
// TestError.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

#define WORD_SIZE 64
#define Word_Load "LOAD"
#define Word_Off "OFF"
const char *arrWord = "abc";

char * FindDifference(FILE *fp)
{
    
    char s[WORD_SIZE];
    fgets(s, WORD_SIZE, fp);
    printf("%s\n", s);



    if ()
    {
        printf("Error!Not Compared!")
    }
    else
    {
        printf("Succsse!Compared!")
        return NULL;
    }

    return NULL;
    
    //if ()
    //{
    //}
}



int main(int argc, char* argv[])
{
    FILE *fp;
    char c;
    char s[20];
    //char *a[2];
    //a[0]= "C:\\Users\\samni\\Desktop\\test\\a.txt";
    if (argc != 2)
    {
        printf("Error format,Usage: display filename1\n");
        return 0; //键入了错误的命令行,结束程序的执行
    }
    //if ((fp = fopen("C:\\Users\\samni\\Desktop\\test\\a.txt", "r")) == NULL)
    //if ((fp = fopen(a[0], "r")) == NULL)
    if ((fp = fopen(argv[1], "r")) == NULL)
    {
        printf("Error!This file can not open\n");
    }
    else
    {
        FindDifference(fp);
        
        //fgets(s,20,fp);
        //printf("%c\n", c);
        //printf("%s\n", s);
        printf("Succsed!\n");
    }
    fclose(fp);
    system("pause");
    return 0;
}

 

 
// TestErrorCos.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAX_LINES 100
#define PERLINE_SIZE 100
#define Word_Load "LOAD"
#define Word_Off "off"

typedef struct Data
{
    unsigned int LoadOff;
    unsigned int vaddr;
    unsigned int paddr;

}Data;

Data typData;


char *FindDifference(FILE *fp)
{

    char s[PERLINE_SIZE];
    fgets(s, PERLINE_SIZE, fp);
    printf("%s\n", s);

    if (1)
    {
        printf("Error!Not Compared!");
    }
    else
    {
        printf("Succsse!Compared!");
        return NULL;
    }

    return NULL;
}


unsigned int ReadFile(char buf[][PERLINE_SIZE], FILE *fpIn)
{
    unsigned int lineNum = 0;
    char *retVal = NULL;
    while (!feof(fpIn))
    {
        fgets(buf[lineNum], PERLINE_SIZE, fpIn);
        lineNum++;
    }

    return lineNum;
}

int main(int argc, char* argv[])
{
    
    FILE *fpIn;
    int lines;

    char buffer[MAX_LINES][PERLINE_SIZE];//存放每一行缓存
    
    char *pBuffer = *buffer;
    
    //if (argc != 2)
    //{
    //    printf("Error format,Usage: display filename1\n");
    //    return 0; //键入了错误的命令行,结束程序的执行
    //}
    //if ((fpIn = fopen(argv[1], "r")) == NULL)
    if ((fpIn=fopen("C:\\Users\\10203524\\Desktop\\123\\A53_Apptemplate_CMAC_Gcc_o.mem", "r")) == NULL)
    {
        printf("Error!This file can not open\n");
    }
    else
    {
        lines = ReadFile(buffer, fpIn);

        //FindDifference(fp);
        
        for (size_t i = 0; i < lines-1; i++)
        {
            printf("%s", buffer[i]);
        }

        printf("Succsed!\n");
    }
    fclose(fpIn);
    system("pause");
    return 0;
}
A53_Apptemplate_CMAC_Gcc_o.axf:     file format elf32-bigarm

Program Header:
0x70000001 off    0x009d8000 vaddr 0x05a00000 paddr 0x05a00000 align 2**2
         filesz 0x00000698 memsz 0x00000698 flags r--
    LOAD off    0x00008000 vaddr 0x00000000 paddr 0x00000000 align 2**15
         filesz 0x000a60a8 memsz 0x000a60a8 flags rwx
    LOAD off    0x000b0000 vaddr 0x00400000 paddr 0x00400000 align 2**15
         filesz 0x00037504 memsz 0x00037504 flags rw-

 

 
// TestErrorCos.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAX_LINES 100
#define PERLINE_SIZE 100
#define Word_Load "LOAD"
#define Word_Off "off"

#define UINT32 unsigned int
#define UINT8 unsigned char

typedef struct digitalData
{
    UINT32 LoadOff;
    UINT32 vaddr;
    UINT32 paddr;
    UINT32 filesz;
    UINT32 memsz;
    char flags[5];
}digitalData;

typedef struct charData
{
    char cLoadOff[11];
    char cvaddr[11];
    char cpaddr[11];
    char cfilesz[11];
    char cmemsz[11];
    char cflags[4];
}charData;

digitalData typData[PERLINE_SIZE/2];


//判断是否越界
char *IsOverborder()
{

    return NULL;
}

//比较vaddr和paddr的值是否相等
char *CompareValue()
{

    return NULL;
}


//拆分字符串
char *SplitWords(char buf[][PERLINE_SIZE] , int totalLines)
{
    UINT32 lineNum = 0; 
    UINT32 tmpLineNum = 0;
    UINT32 column = 0; 
    UINT32 tmpColumn = 0;
    UINT8 count = 0;
    UINT8 i=0;
    charData typCharData[PERLINE_SIZE / 2];
    //寻找第一个LOAD头
    for (lineNum = 0, column = 0; lineNum<totalLines;)
    {

        //找到LOAD头
        if (buf[lineNum][column] == 'L'&&buf[lineNum][column+1] == 'O'
          &&buf[lineNum][column+2] == 'A'&&buf[lineNum][column+3] == 'D')
        {
            break;
        }
        //换行
        if (buf[lineNum][column]=='\n')
        {
            lineNum++;
            column=0;
        }
        column++;
    }
    //column--;

    //清空格
    tmpLineNum = lineNum;
    tmpColumn = 0;
    column = 0;
    while (tmpLineNum < totalLines)
    {
        if (buf[tmpLineNum][column]!= ' ')
        {
            buf[tmpLineNum][tmpColumn] = buf[tmpLineNum][column];
            tmpColumn++;
        }
        column++;
        if (buf[tmpLineNum][column] == '\n')
        {
            buf[tmpLineNum][tmpColumn] = buf[tmpLineNum][column];
            tmpLineNum++;
            tmpColumn = 0;
            column = 0;
        }
    }

    column = 0;
    tmpLineNum = 0;
    //将字符送入结构体中
    while (lineNum < totalLines)
    {
        //每一行转换
        while (buf[lineNum][column] != '\n')
        {
            if (count % 2 == 0)
            {
                //LOAD off
                if (buf[lineNum][column] == 'L'&&buf[lineNum][column + 1] == 'O'
                    &&buf[lineNum][column + 2] == 'A'&&buf[lineNum][column + 3] == 'D')
                {
                    column += 7;
                    for (i = 0; i < 10; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }

                //vaddr
                if (buf[lineNum][column] == 'v'&&buf[lineNum][column + 1] == 'a'
                    &&buf[lineNum][column + 2] == 'd'&&buf[lineNum][column + 3] == 'd'&&buf[lineNum][column + 3] == 'r')
                {
                    column += 5;
                    for (i = 0; i < 10; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }
                //paddr
                if (buf[lineNum][column] == 'p'&&buf[lineNum][column + 1] == 'a'
                    &&buf[lineNum][column + 2] == 'd'&&buf[lineNum][column + 3] == 'd'&&buf[lineNum][column + 3] == 'r')
                {
                    column += 5;
                    for (i = 0; i < 10; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }

                
            }
            else
            {
                //fileze
                if (buf[lineNum][column] == 'f'&&buf[lineNum][column + 1] == 'i'
                    &&buf[lineNum][column + 2] == 'l'&&buf[lineNum][column + 3] == 'e'
                    &&buf[lineNum][column + 3] == 'z'&&buf[lineNum][column + 3] == 'e')
                {
                    column += 6;
                    for (i = 0; i < 10; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }
                //memsz
                if (buf[lineNum][column] == 'm'&&buf[lineNum][column + 1] == 'e'
                    &&buf[lineNum][column + 2] == 'm'&&buf[lineNum][column + 3] == 's'&&buf[lineNum][column + 3] == 'z')
                {
                    column += 5;
                    for (i = 0; i < 10; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }
                //flags
                if (buf[lineNum][column] == 'f'&&buf[lineNum][column + 1] == 'l'
                    &&buf[lineNum][column + 2] == 'a'&&buf[lineNum][column + 3] == 'g'&&buf[lineNum][column + 4] == 's')
                {
                    column += 5;
                    for (i = 0; i < 4; i++, column++)
                    {
                        typCharData[tmpLineNum].cLoadOff[i] = buf[lineNum][column];
                    }
                    typCharData[tmpLineNum].cLoadOff[i + 1] = '\n';
                }
            }
            if (count % 2 == 0)
            {
                tmpLineNum++;
            }
            count++;
        }
        lineNum++;
    }
    return NULL;
}


UINT32 ReadFile(char buf[][PERLINE_SIZE], FILE *fpIn)
{
    UINT32 lineNum = 0;
    //char *retVal = NULL;
    while (!feof(fpIn))
    {
        fgets(buf[lineNum], PERLINE_SIZE, fpIn);
        lineNum++;
    }

    return lineNum;
}

int main(int argc, char* argv[])
{
    FILE *fpIn;
    int lines;
    char buffer[MAX_LINES][PERLINE_SIZE];//存放每一行缓存
    char *pBuffer = *buffer;

    //if (argc != 2)
    //{
    //    printf("Error format,Usage: display filename1\n");
    //    return 0; //键入了错误的命令行,结束程序的执行
    //}
    //if ((fpIn = fopen(argv[1], "r")) == NULL)
    if ((fpIn = fopen("C:\\Users\\samni\\Desktop\\A53_Apptemplate_CMAC_Gcc_o.mem", "r")) == NULL)
    {
        printf("Error!This file can not open\n");
    }
    else
    {
        lines = ReadFile(buffer, fpIn);

        //FindDifference(fp);
        SplitWords(buffer, lines);
        for (size_t i = 0; i < lines - 1; i++)
        {
            printf("%s", buffer[i]);
        }

        printf("Succsed!\n");
    }
    fclose(fpIn);
    system("pause");
    return 0;
}

 

// TestErrorCos.cpp : 定义控制台应用程序的入口点。
//C:\\Users\\samni\\Desktop\\A53_Apptemplate_CMAC_Gcc_o.mem

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAX_LINES 100
#define PERLINE_SIZE 100

#define UINT32 unsigned int
#define UINT8 unsigned char


typedef enum BOOL
{
    FALSE = 0,
    TRUE
}BOOL;

typedef enum ERROR_TYPE
{
    ERR_ADDRESS,
    ERR_MEMORY_OVERBOARD,
    ERR_OTHER,
    NO_ERR
}ERROR_TYPE;

//#define TRUE 1
//#define FALSE 0

typedef struct digitalData
{
    UINT32 LoadOff;
    UINT32 vaddr;
    UINT32 paddr;
    UINT32 filesz;
    UINT32 memsz;
    char flags[4];
    UINT32 lineNum;
}digitalData;

typedef struct charData
{
    char cLoadOff[11];
    char cvaddr[11];
    char cpaddr[11];
    char cfilesz[11];
    char cmemsz[11];
    char cflags[4];
    UINT32 lineNum;
}charData;

typedef struct errDataRecord
{
    UINT32 errCount = 0;
    UINT32 errMemOverLineNum[MAX_LINES / 2];
    UINT32 errAddrLineNum[MAX_LINES / 2];
}errDataRecord;



BOOL Memcpy(char *des, char *src, UINT32 length)
{
    UINT8 i;
    if (des == NULL || src == NULL)
    {
        return FALSE;
    }
    else
    {
        for (i = 0; i < length; i++)
        {
            *des++ = *src++;
        }
        return TRUE;
    }
}



//判断是否越界
ERROR_TYPE IsMemoryOverbord(digitalData * typTmpDigitalData, UINT32 lines,
    char orignalBuf[][PERLINE_SIZE], errDataRecord * typErrDataRecord)
{
    UINT32 errMemCount=0;
    UINT32 lineNum;
    UINT32 upLimit[MAX_LINES/2];
    UINT32 downLimit[MAX_LINES / 2];

    for (lineNum = 0; lineNum < lines;lineNum++)
    {
        upLimit[lineNum] = typTmpDigitalData[lineNum].vaddr;
        downLimit[lineNum] = typTmpDigitalData[lineNum].vaddr + typTmpDigitalData[lineNum].memsz - 1;
    }
    for (lineNum = 0; lineNum < lines; lineNum++)
    {
        for (size_t i = 0, errMemCount=0; i < lines; i++)
        {
            if (upLimit[lineNum] > downLimit[i] && downLimit[lineNum]<upLimit[i])
            {
                
                typErrDataRecord->errMemOverLineNum[errMemCount] = typTmpDigitalData[lineNum].lineNum;
                printf("%s,%s\n", orignalBuf[typErrDataRecord->errMemOverLineNum[errMemCount]], "ERR_MEMORY_OVERBOARD!");
                printf("%s\n", orignalBuf[typErrDataRecord->errMemOverLineNum[errMemCount] + 1]);
                errMemCount++;
            }
        }
    }
    if (errMemCount==0)
    {
        printf("Memory no error!\n");
        return NO_ERR;
    }
    return ERR_MEMORY_OVERBOARD;
}

//比较vaddr和paddr的值是否相等
ERROR_TYPE IsAddressValueEqual(digitalData * typTmpDigitalData, UINT32 lines,
    char orignalBuf[][PERLINE_SIZE], errDataRecord * typErrDataRecord)
{
    UINT32 errAddrCount;
    UINT32 lineNum;

    for (lineNum = 0, errAddrCount = 0; lineNum < lines; lineNum++)
    {
        if (typTmpDigitalData[lineNum].vaddr != typTmpDigitalData[lineNum].paddr)
        {
            typErrDataRecord->errAddrLineNum[errAddrCount] = typTmpDigitalData[lineNum].lineNum;
            printf("%s,%s\n", orignalBuf[typErrDataRecord->errAddrLineNum[errAddrCount]], "ERR_ADDRESS!");
            printf("%s\n", orignalBuf[typErrDataRecord->errAddrLineNum[errAddrCount] + 1]);
            errAddrCount++;
        }
    }
    if (errAddrCount == 0)
    {
        printf("Address no error!\n");
        return NO_ERR;
    }
    return ERR_ADDRESS;

}



//拆分字符串
UINT32 SplitWords(char orignalBuf[][PERLINE_SIZE], UINT32 totalLines, charData *typTmpCharData)
{
    UINT32 lineNum = 0;
    UINT32 tmpLineNum = 0;
    UINT32 column = 0;
    UINT32 tmpColumn = 0;
    UINT8 count = 0;
    UINT8 i = 0;
    BOOL isLOADoff = FALSE;
    char tmpBuffer[MAX_LINES][PERLINE_SIZE];

    //备份
    for (tmpLineNum = 0; tmpLineNum < totalLines; tmpLineNum++)
    {
        Memcpy(tmpBuffer[tmpLineNum], orignalBuf[tmpLineNum], sizeof(orignalBuf[tmpLineNum]));
    }
    //charData typTmpCharData[PERLINE_SIZE / 2];
    //charData *ptypTmpCharData = typTmpCharData;
    //寻找第一个LOAD头
    for (lineNum = 0, column = 0; lineNum < totalLines;)
    {

        //找到LOAD头
        if (tmpBuffer[lineNum][column] == 'L'&&tmpBuffer[lineNum][column + 1] == 'O'
            &&tmpBuffer[lineNum][column + 2] == 'A'&&tmpBuffer[lineNum][column + 3] == 'D')
        {
            break;
        }
        //换行
        if (tmpBuffer[lineNum][column] == '\n')
        {
            lineNum++;
            column = 0;
        }
        column++;
    }
    //column--;

    //清空格
    tmpLineNum = lineNum;
    tmpColumn = 0;
    column = 0;
    while (tmpLineNum < totalLines)
    {
        if (tmpBuffer[tmpLineNum][column] == '\n')
        {
            tmpBuffer[tmpLineNum][tmpColumn] = tmpBuffer[tmpLineNum][column];
            tmpLineNum++;
            tmpColumn = 0;
            column = 0;
        }
        else if (tmpBuffer[tmpLineNum][column] != ' ')
        {
            tmpBuffer[tmpLineNum][tmpColumn] = tmpBuffer[tmpLineNum][column];
            tmpColumn++;
            column++;
        }
        else if (tmpBuffer[tmpLineNum][column] == ' ')
        {
            column++;
        }
    }

    column = 0;
    tmpLineNum = 0;
    //将字符送入结构体中
    while (lineNum < totalLines)
    {
        //判断LOADoff
        //column = strncmp("LOADoff", tmpBuffer[lineNum], 7);

        //column = 0;
        if (strncmp("LOADoff", tmpBuffer[lineNum], 7) == 0 || strncmp("LOADoff", tmpBuffer[lineNum - 1], 7) == 0)
        {
            isLOADoff = TRUE;
        }
        else
        {
            isLOADoff = FALSE;
        }
        //每一行转换
        while (tmpBuffer[lineNum][column] != '\n')
        {

            if (count % 2 == 0)
            {
                //LOAD off
                if (tmpBuffer[lineNum][column] == 'L'&&tmpBuffer[lineNum][column + 1] == 'O'
                    &&tmpBuffer[lineNum][column + 2] == 'A'&&tmpBuffer[lineNum][column + 3] == 'D')
                {
                    column += 7;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cLoadOff[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cLoadOff[i] = '\n';
                    column--;

                }

                //vaddr
                if (tmpBuffer[lineNum][column + 1] == 'v'&&tmpBuffer[lineNum][column + 2] == 'a'
                    &&tmpBuffer[lineNum][column + 3] == 'd'&&tmpBuffer[lineNum][column + 4] == 'd'
                    &&tmpBuffer[lineNum][column + 5] == 'r'&& isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cvaddr[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cvaddr[i] = '\n';
                    column--;
                }
                //paddr
                if (tmpBuffer[lineNum][column + 1] == 'p'&&tmpBuffer[lineNum][column + 2] == 'a'
                    &&tmpBuffer[lineNum][column + 3] == 'd'&&tmpBuffer[lineNum][column + 4] == 'd'
                    &&tmpBuffer[lineNum][column + 5] == 'r'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cpaddr[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cpaddr[i] = '\n';
                    column--;
                }


            }
            else
            {
                //filesz
                if (tmpBuffer[lineNum][column] == 'f'&&tmpBuffer[lineNum][column + 1] == 'i'
                    &&tmpBuffer[lineNum][column + 2] == 'l'&&tmpBuffer[lineNum][column + 3] == 'e'
                    &&tmpBuffer[lineNum][column + 4] == 's'&&tmpBuffer[lineNum][column + 5] == 'z'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cfilesz[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cfilesz[i] = '\n';
                }
                //memsz
                if (tmpBuffer[lineNum][column + 1] == 'm'&&tmpBuffer[lineNum][column + 2] == 'e'
                    &&tmpBuffer[lineNum][column + 3] == 'm'&&tmpBuffer[lineNum][column + 4] == 's'
                    &&tmpBuffer[lineNum][column + 5] == 'z'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cmemsz[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cmemsz[i] = '\n';
                }
                //flags
                if (tmpBuffer[lineNum][column + 1] == 'f'&&tmpBuffer[lineNum][column + 2] == 'l'
                    &&tmpBuffer[lineNum][column + 3] == 'a'&&tmpBuffer[lineNum][column + 4] == 'g'
                    &&tmpBuffer[lineNum][column + 5] == 's'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 3; i++)
                    {
                        typTmpCharData[tmpLineNum].cflags[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cflags[i] = '\n';
                }

            }
            column++;
        }

        if (count % 2 == 0 && isLOADoff)//满足为LOAD或LOAD下一行
        {
            tmpLineNum++;
            column = 0;
            if (count == 0)
            {
                tmpLineNum = 0;
            }
            typTmpCharData[tmpLineNum].lineNum = lineNum;//记录行号
        }
        lineNum++;
        count++;
        column = 0;
    }
    return tmpLineNum;
}


//将得到的字符串数组转换成数据
void StringToValue(digitalData * typTmpDigitalData, charData *tmpCharData, UINT32 lines)
{
    UINT8 i;
    for (i = 0; i < lines; i++)
    {
        typTmpDigitalData[i].LoadOff = strtol(tmpCharData[i].cLoadOff, NULL, 16);
        typTmpDigitalData[i].LoadOff = strtol(tmpCharData[i].cLoadOff, NULL, 16);
        typTmpDigitalData[i].vaddr = strtol(tmpCharData[i].cvaddr, NULL, 16);
        typTmpDigitalData[i].paddr = strtol(tmpCharData[i].cpaddr, NULL, 16);
        typTmpDigitalData[i].filesz = strtol(tmpCharData[i].cfilesz, NULL, 16);
        typTmpDigitalData[i].memsz = strtol(tmpCharData[i].cmemsz, NULL, 16);
        Memcpy(typTmpDigitalData[i].flags, tmpCharData[i].cflags, sizeof(tmpCharData[i].cflags));
        typTmpDigitalData[i].lineNum = tmpCharData[i].lineNum;//记录原数据行号
    }
    //return ptypTmpDigitalData;
}

UINT32 ReadFile(char buf[][PERLINE_SIZE], FILE *fpIn)
{
    UINT32 lineNum = 0;
    //char *retVal = NULL;
    while (!feof(fpIn))
    {
        fgets(buf[lineNum], PERLINE_SIZE, fpIn);
        lineNum++;
    }
    lineNum--;//因为EOF在最后一行的下一行,所以总行数要减一
    return lineNum;
}

int main(int argc, char* argv[])
{
    FILE *fpIn;
    UINT32 lines;
    UINT32 charDataLines;
    char orignalBufferFromFile[MAX_LINES][PERLINE_SIZE];//存放每一行缓存
    errDataRecord typErrDataRecord;
    //char *pBuffer = *orignalBufferFromFile;
    //数组形式
    charData typCharData[MAX_LINES / 2];
    //charData *ptypCharData = typCharData;
    //
    digitalData typdigitalData[PERLINE_SIZE / 2];
    //digitalData *ptypdigitalData = typdigitalData;
    //if (argc != 2)
    //{
    //    printf("Error format,Usage: display filename1\n");
    //    return 0; //键入了错误的命令行,结束程序的执行
    //}
    //if ((fpIn = fopen(argv[1], "r")) == NULL)
    if ((fpIn = fopen("C:\\Users\\samni\\Desktop\\A53_Apptemplate_CMAC_Gcc_o.mem", "r")) == NULL)
    {
        printf("Error!This file can not open\n");
    }
    else
    {
        lines = ReadFile(orignalBufferFromFile, fpIn);//从文件中读取数据
        charDataLines = SplitWords(orignalBufferFromFile, lines, (charData*)typCharData);//将数据分割成cLoadOff[], cvaddr[],cpaddr[],cfilesz[],cmemsz[],cflags[]
        StringToValue((digitalData*)typdigitalData, (charData*)typCharData, charDataLines);//将十六进制字符串转换为十六进制数
        IsAddressValueEqual((digitalData*)typdigitalData, charDataLines, orignalBufferFromFile, (errDataRecord *)&typErrDataRecord);//比较地址值是否相等
        IsMemoryOverbord((digitalData*)typdigitalData, charDataLines, orignalBufferFromFile, (errDataRecord *)&typErrDataRecord);

        printf("Succsed!\n");
    }
    fclose(fpIn);
    system("pause");
    return 0;
}

 

A53_Apptemplate_CMAC_Gcc_o.axf:     file format elf32-bigarm

Program Header:
0x70000001 off    0x009d8000 vaddr 0x05a00000 paddr 0x05a00000 align 2**2
         filesz 0x00000698 memsz 0x00000698 flags r--
    LOAD off    0x00008000 vaddr 0x00000000 paddr 0x00000000 align 2**15
         filesz 0x000a60a8 memsz 0x000a60a8 flags rwx
    LOAD off    0x000b0000 vaddr 0x00400000 paddr 0x00400000 align 2**15
         filesz 0x00037504 memsz 0x00037504 flags rw-
    LOAD off    0x000e8000 vaddr 0x01400000 paddr 0x01400000 align 2**15
         filesz 0x00000000 memsz 0x00018000 flags rw-
    LOAD off    0x000e8000 vaddr 0x01500000 paddr 0x01500000 align 2**15
         filesz 0x0085303c memsz 0x0085303c flags rw-
    LOAD off    0x00940000 vaddr 0x01d00000 paddr 0x01d00000 align 2**15
         filesz 0x00000000 memsz 0x001f1000 flags rw-
    LOAD off    0x00940000 vaddr 0x01f00000 paddr 0x01f00000 align 2**15
         filesz 0x00000370 memsz 0x00000370 flags rw-
    LOAD off    0x00948000 vaddr 0x02100000 paddr 0x02100000 align 2**15
         filesz 0x00065088 memsz 0x00065088 flags r-x
    LOAD off    0x009b0000 vaddr 0x02200000 paddr 0x02200000 align 2**15
         filesz 0x00019520 memsz 0x00019520 flags rw-
    LOAD off    0x009d0000 vaddr 0x02400000 paddr 0x02400000 align 2**15
         filesz 0x00000000 memsz 0x003137f0 flags rw-
    LOAD off    0x009d0000 vaddr 0x04400000 paddr 0x04400000 align 2**15
         filesz 0x00000000 memsz 0x000034d8 flags rw-
     TLS off    0x009e0000 vaddr 0x05e00000 paddr 0x05e00000 align 2**2
         filesz 0x00000010 memsz 0x00200018 flags r--
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4
         filesz 0x00000000 memsz 0x00000000 flags rwx

 

 
// TestErrorCos.cpp : 定义控制台应用程序的入口点。
//C:\\Users\\samni\\Desktop\\A53_Apptemplate_CMAC_Gcc_o.mem

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define MAX_LINES 100
#define PERLINE_SIZE 100

#define UINT32 unsigned int
#define UINT8 unsigned char


typedef enum BOOL
{
    FALSE = 0,
    TRUE
}BOOL;

typedef enum ERROR_TYPE
{
    ERR_ADDRESS,
    ERR_MEMORY_OVERBOARD,
    ERR_OTHER,
    NO_ERR
}ERROR_TYPE;

//#define TRUE 1
//#define FALSE 0

typedef struct digitalData
{
    UINT32 LoadOff;
    UINT32 vaddr;
    UINT32 paddr;
    UINT32 filesz;
    UINT32 memsz;
    char flags[4];
    UINT32 lineNum;
}digitalData;

typedef struct charData
{
    char cLoadOff[11];
    char cvaddr[11];
    char cpaddr[11];
    char cfilesz[11];
    char cmemsz[11];
    char cflags[4];
    UINT32 lineNum;
}charData;

typedef struct errDataRecord
{
    UINT32 errCount = 0;
    UINT32 errMemOverLineNum[MAX_LINES / 2];
    UINT32 errAddrLineNum[MAX_LINES / 2];
}errDataRecord;



BOOL Memcpy(char *des, char *src, UINT32 length)
{
    UINT8 i;
    if (des == NULL || src == NULL)
    {
        return FALSE;
    }
    else
    {
        for (i = 0; i < length; i++)
        {
            *des++ = *src++;
        }
        return TRUE;
    }
}



//判断是否越界
ERROR_TYPE IsMemoryOverbord(digitalData * typTmpDigitalData, UINT32 lines,
    char orignalBuf[][PERLINE_SIZE], errDataRecord * typErrDataRecord)
{
    UINT32 errMemCount = 0;
    UINT32 lineNum;
    UINT32 upLimit[MAX_LINES / 2];
    UINT32 downLimit[MAX_LINES / 2];

    for (lineNum = 0; lineNum < lines; lineNum++)
    {
        downLimit[lineNum] = typTmpDigitalData[lineNum].vaddr;
        upLimit[lineNum] = typTmpDigitalData[lineNum].vaddr + typTmpDigitalData[lineNum].memsz - 1;
    }
    for (lineNum = 0, errMemCount = 0; lineNum < lines; lineNum++)
    {
        for (size_t i = lineNum+1; i < lines; i++)
        {
            if (upLimit[lineNum] >= downLimit[i] && downLimit[lineNum] <= upLimit[i])
            {
                //记录超出范围的内存地址
                typErrDataRecord->errMemOverLineNum[errMemCount] = typTmpDigitalData[lineNum].lineNum+1;
                printf("%s  %s %d\n", "ERR_MEMORY_OVERBOARD!", "at line:", typErrDataRecord->errMemOverLineNum[errMemCount]);
                printf("%s", orignalBuf[typErrDataRecord->errMemOverLineNum[errMemCount]-1]);
                printf("%s\n", orignalBuf[typErrDataRecord->errMemOverLineNum[errMemCount]]);
                errMemCount++;
                typErrDataRecord->errCount++;
            }
        }
    }
    if (errMemCount == 0)
    {
        printf("Memory no error!\n");
        return NO_ERR;
    }
    return ERR_MEMORY_OVERBOARD;
}

//比较vaddr和paddr的值是否相等
ERROR_TYPE IsAddressValueEqual(digitalData * typTmpDigitalData, UINT32 lines,
    char orignalBuf[][PERLINE_SIZE], errDataRecord * typErrDataRecord)
{
    UINT32 errAddrCount;
    UINT32 lineNum;

    for (lineNum = 0, errAddrCount = 0; lineNum < lines; lineNum++)
    {
        if (typTmpDigitalData[lineNum].vaddr != typTmpDigitalData[lineNum].paddr)
        {
            typErrDataRecord->errAddrLineNum[errAddrCount] = typTmpDigitalData[lineNum].lineNum+1;
            printf("%s  %s %d\n", "ERR_ADDRESS!", "at line:", typErrDataRecord->errAddrLineNum[errAddrCount]);
            printf("%s", orignalBuf[typErrDataRecord->errAddrLineNum[errAddrCount]-1]);
            printf("%s\n", orignalBuf[typErrDataRecord->errAddrLineNum[errAddrCount]]);
            errAddrCount++;
            typErrDataRecord->errCount++;
        }
    }
    if (errAddrCount == 0)
    {
        printf("Address no error!\n");
        return NO_ERR;
    }
    return ERR_ADDRESS;

}



//拆分字符串
UINT32 SplitWords(char orignalBuf[][PERLINE_SIZE], UINT32 totalLines, charData *typTmpCharData)
{
    UINT32 lineNum = 0;
    UINT32 tmpLineNum = 0;
    UINT32 column = 0;
    UINT32 tmpColumn = 0;
    UINT8 count = 0;
    UINT8 i = 0;
    BOOL isLOADoff = FALSE;
    char tmpBuffer[MAX_LINES][PERLINE_SIZE];

    //备份
    for (tmpLineNum = 0; tmpLineNum < totalLines; tmpLineNum++)
    {
        Memcpy(tmpBuffer[tmpLineNum], orignalBuf[tmpLineNum], sizeof(orignalBuf[tmpLineNum]));
    }
    //charData typTmpCharData[PERLINE_SIZE / 2];
    //charData *ptypTmpCharData = typTmpCharData;
    //寻找第一个LOAD头
    for (lineNum = 0, column = 0; lineNum < totalLines;)
    {

        //找到LOAD头
        if (tmpBuffer[lineNum][column] == 'L'&&tmpBuffer[lineNum][column + 1] == 'O'
            &&tmpBuffer[lineNum][column + 2] == 'A'&&tmpBuffer[lineNum][column + 3] == 'D')
        {
            break;
        }
        //换行
        if (tmpBuffer[lineNum][column] == '\n')
        {
            lineNum++;
            column = 0;
        }
        column++;
    }
    //column--;

    //清空格
    tmpLineNum = lineNum;
    tmpColumn = 0;
    column = 0;
    while (tmpLineNum < totalLines)
    {
        if (tmpBuffer[tmpLineNum][column] == '\n')
        {
            tmpBuffer[tmpLineNum][tmpColumn] = tmpBuffer[tmpLineNum][column];
            tmpLineNum++;
            tmpColumn = 0;
            column = 0;
        }
        else if (tmpBuffer[tmpLineNum][column] != ' ')
        {
            tmpBuffer[tmpLineNum][tmpColumn] = tmpBuffer[tmpLineNum][column];
            tmpColumn++;
            column++;
        }
        else if (tmpBuffer[tmpLineNum][column] == ' ')
        {
            column++;
        }
    }

    column = 0;
    tmpLineNum = 0;
    //将字符送入结构体中
    while (lineNum < totalLines)
    {
        //判断LOADoff
        //column = strncmp("LOADoff", tmpBuffer[lineNum], 7);

        //column = 0;
        if (strncmp("LOADoff", tmpBuffer[lineNum], 7) == 0 || strncmp("LOADoff", tmpBuffer[lineNum - 1], 7) == 0)
        {
            isLOADoff = TRUE;
        }
        else
        {
            isLOADoff = FALSE;
        }
        //每一行转换
        while (tmpBuffer[lineNum][column] != '\n')
        {

            if (count % 2 == 0)
            {
                //LOAD off
                if (tmpBuffer[lineNum][column] == 'L'&&tmpBuffer[lineNum][column + 1] == 'O'
                    &&tmpBuffer[lineNum][column + 2] == 'A'&&tmpBuffer[lineNum][column + 3] == 'D')
                {
                    column += 7;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cLoadOff[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cLoadOff[i] = '\n';
                    column--;

                }

                //vaddr
                if (tmpBuffer[lineNum][column + 1] == 'v'&&tmpBuffer[lineNum][column + 2] == 'a'
                    &&tmpBuffer[lineNum][column + 3] == 'd'&&tmpBuffer[lineNum][column + 4] == 'd'
                    &&tmpBuffer[lineNum][column + 5] == 'r'&& isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cvaddr[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cvaddr[i] = '\n';
                    column--;
                }
                //paddr
                if (tmpBuffer[lineNum][column + 1] == 'p'&&tmpBuffer[lineNum][column + 2] == 'a'
                    &&tmpBuffer[lineNum][column + 3] == 'd'&&tmpBuffer[lineNum][column + 4] == 'd'
                    &&tmpBuffer[lineNum][column + 5] == 'r'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cpaddr[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    typTmpCharData[tmpLineNum].cpaddr[i] = '\n';
                    column--;
                }


            }
            else
            {
                //filesz
                if (tmpBuffer[lineNum][column] == 'f'&&tmpBuffer[lineNum][column + 1] == 'i'
                    &&tmpBuffer[lineNum][column + 2] == 'l'&&tmpBuffer[lineNum][column + 3] == 'e'
                    &&tmpBuffer[lineNum][column + 4] == 's'&&tmpBuffer[lineNum][column + 5] == 'z'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cfilesz[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cfilesz[i] = '\n';
                }
                //memsz
                if (tmpBuffer[lineNum][column + 1] == 'm'&&tmpBuffer[lineNum][column + 2] == 'e'
                    &&tmpBuffer[lineNum][column + 3] == 'm'&&tmpBuffer[lineNum][column + 4] == 's'
                    &&tmpBuffer[lineNum][column + 5] == 'z'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 10; i++)
                    {
                        typTmpCharData[tmpLineNum].cmemsz[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cmemsz[i] = '\n';
                }
                //flags
                if (tmpBuffer[lineNum][column + 1] == 'f'&&tmpBuffer[lineNum][column + 2] == 'l'
                    &&tmpBuffer[lineNum][column + 3] == 'a'&&tmpBuffer[lineNum][column + 4] == 'g'
                    &&tmpBuffer[lineNum][column + 5] == 's'&&isLOADoff)
                {
                    column += 6;
                    for (i = 0; i < 3; i++)
                    {
                        typTmpCharData[tmpLineNum].cflags[i] = tmpBuffer[lineNum][column];
                        column++;
                    }
                    column--;
                    typTmpCharData[tmpLineNum].cflags[i] = '\n';
                }

            }
            column++;
        }
        //处理第一行
        if (count == 0)
        {
            tmpLineNum = 0;
            typTmpCharData[tmpLineNum].lineNum = lineNum;//记录行号
        }

        if (count % 2 != 0 && isLOADoff)//满足为LOAD或LOAD下一行
        {
            tmpLineNum++;
            column = 0;
            typTmpCharData[tmpLineNum].lineNum = lineNum+1;//记录行号
        }
        lineNum++;
        count++;
        column = 0;
    }
    return tmpLineNum;
}


//将得到的字符串数组转换成数据
void StringToValue(digitalData * typTmpDigitalData, charData *tmpCharData, UINT32 lines)
{
    UINT8 i;
    for (i = 0; i < lines; i++)
    {
        typTmpDigitalData[i].LoadOff = strtol(tmpCharData[i].cLoadOff, NULL, 16);
        typTmpDigitalData[i].LoadOff = strtol(tmpCharData[i].cLoadOff, NULL, 16);
        typTmpDigitalData[i].vaddr = strtol(tmpCharData[i].cvaddr, NULL, 16);
        typTmpDigitalData[i].paddr = strtol(tmpCharData[i].cpaddr, NULL, 16);
        typTmpDigitalData[i].filesz = strtol(tmpCharData[i].cfilesz, NULL, 16);
        typTmpDigitalData[i].memsz = strtol(tmpCharData[i].cmemsz, NULL, 16);
        Memcpy(typTmpDigitalData[i].flags, tmpCharData[i].cflags, sizeof(tmpCharData[i].cflags));
        typTmpDigitalData[i].lineNum = tmpCharData[i].lineNum;//记录原数据行号
    }
    //return ptypTmpDigitalData;
}

UINT32 ReadFile(char buf[][PERLINE_SIZE], FILE *fpIn)
{
    UINT32 lineNum = 0;
    //char *retVal = NULL;
    while (!feof(fpIn))
    {
        fgets(buf[lineNum], PERLINE_SIZE, fpIn);
        lineNum++;
    }
    lineNum--;//因为EOF在最后一行的下一行,所以总行数要减一
    return lineNum;
}

int main(int argc, char* argv[])
{
    FILE *fpIn;
    UINT32 lines;
    UINT32 charDataLines;
    char orignalBufferFromFile[MAX_LINES][PERLINE_SIZE];//存放每一行缓存
    errDataRecord typErrDataRecord;
    
    //数组形式
    charData typCharData[MAX_LINES / 2];    
    //
    digitalData typdigitalData[PERLINE_SIZE / 2];
    
    if (argc != 2)
    {
        printf("Error format,Usage: display filename1\n");
        return 0; //键入了错误的命令行,结束程序的执行
    }
    if ((fpIn = fopen(argv[1], "r")) == NULL)
    //if ((fpIn = fopen("C:\\Users\\samni\\Desktop\\A53_Apptemplate_CMAC_Gcc_o.mem", "r")) == NULL)
    {
        printf("Error!This file can not open\n");
    }
    else
    {
        lines = ReadFile(orignalBufferFromFile, fpIn);//从文件中读取数据
        charDataLines = SplitWords(orignalBufferFromFile, lines, (charData*)typCharData);//将数据分割成cLoadOff[], cvaddr[],cpaddr[],cfilesz[],cmemsz[],cflags[]
        StringToValue((digitalData*)typdigitalData, (charData*)typCharData, charDataLines);//将十六进制字符串转换为十六进制数
        IsAddressValueEqual((digitalData*)typdigitalData, charDataLines, orignalBufferFromFile, (errDataRecord *)&typErrDataRecord);//比较地址值是否相等
        IsMemoryOverbord((digitalData*)typdigitalData, charDataLines, orignalBufferFromFile, (errDataRecord *)&typErrDataRecord);

        printf("Succsed!\n");
    }
    fclose(fpIn);
    system("pause");
    return 0;
}

 

 
 

  

posted @ 2016-07-24 21:05  alexliu2360  阅读(238)  评论(0编辑  收藏  举报