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; }