如何用C语言提取含有大量数据文件的特定信息(包含16进制数据的提取)
2011-03-22 15:30
666 查看
用C++读取文件中的数据时,会出现一些“莫名”的错误(即在C#中不会出现),这跟C中的API有关。最近笔者帮一位同事调试程序时,就遇到了这种情况。 文件数据(用于编写系统缓存)如下所示(只显示其中的一部分):
183 0 0x00000010
269 1 0x094055b0
346 1 0x094055a8
361 1 0x094055ac
489 0 0x00000028
575 1 0x094055c8
667 1 0x094055c0
716 1 0x094055c4
799 0 0x00000040
826 1 0x094055e0
916 1 0x094055d8
975 1 0x094055dc
1064 0 0x00000058
其中“183 0 0x00000010”表示代号、布尔类型及十六进制地址数据,若要将特定数据提取出来,我们可能会把类似“0x00000010”的数据用作string类型进行处理(当然我们也可以把它直接处理成十六进制数据,但须注意十六进制数据在C++中用大写的“X”表示,而不是小写的“x”)。下面是刚刚写的一段测试程序,在command窗口显示提取的数据。
函数CountLines(char *filename)用于获取文件的行数
注意:sscanf(buf,"%d %d",&i1,&i2);该语句不可改成
sscanf(buf,"%d %d %s",&i1,&i2,&s1);,否则在程序返回时因地址空间不能清除而报错。
转自: http://software.intel.com/zh-cn/blogs/2011/01/20/c16/
183 0 0x00000010
269 1 0x094055b0
346 1 0x094055a8
361 1 0x094055ac
489 0 0x00000028
575 1 0x094055c8
667 1 0x094055c0
716 1 0x094055c4
799 0 0x00000040
826 1 0x094055e0
916 1 0x094055d8
975 1 0x094055dc
1064 0 0x00000058
其中“183 0 0x00000010”表示代号、布尔类型及十六进制地址数据,若要将特定数据提取出来,我们可能会把类似“0x00000010”的数据用作string类型进行处理(当然我们也可以把它直接处理成十六进制数据,但须注意十六进制数据在C++中用大写的“X”表示,而不是小写的“x”)。下面是刚刚写的一段测试程序,在command窗口显示提取的数据。
#include <iostream> #include <stdio.h> #include <fstream> #include <string> using namespace std;
int CountLines(char *filename) { ifstream ReadFile; int n=0; string temp; ReadFile.open(filename,ios::in); if(ReadFile.fail()) { return 0; } else { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { FILE *fp; char *buf; string temp=""; string temp1=""; int i1,i2=0; string addr_0=string("p0.tr"); int all_lines=CountLines("p0.tr"); int tag=0; if((fp = fopen(addr_0.c_str(), "r")) != NULL){ while(!feof(fp)) { if(tag>=all_lines) break; buf=new char[100]; fgets(buf,100,fp); sscanf(buf,"%d %d",&i1,&i2); int length=strlen(buf); for(int i=length-11;i<length-1;i++) temp1+=buf[i]; printf("%d %d %s/n",i1,i2,temp1.c_str()); temp1=""; free(buf); tag++; }
} fclose(fp); return; }
函数CountLines(char *filename)用于获取文件的行数
注意:sscanf(buf,"%d %d",&i1,&i2);该语句不可改成
sscanf(buf,"%d %d %s",&i1,&i2,&s1);,否则在程序返回时因地址空间不能清除而报错。
转自: http://software.intel.com/zh-cn/blogs/2011/01/20/c16/
相关文章推荐
- 【笔试】超大文件里的数据去重排序;将log中MAC地址提取出来;取出数据库表T里第20行到29行的数据;如何判断一个二叉树B是不是二叉树A的子树?
- Windows下如何用C语言清空特定文件夹中的所有文件(转载)
- C语言学习10:结构体,结构体应用,联合用法,枚举,fopen函数使用,fseek,ftell的作用和文件结束符EOF,数组和文件交换数据,个人信息管理。
- Spark Mllib里如何将trainDara训练数据文件里提取第M到第N字段(图文详解)
- 如何从SQL备份文件中提取出特定库
- Java中,当表单含有文件上传时,提交数据的如何读取
- C语言中如何单独包含Winbase.h文件
- 如何用C语言清空特定文件夹中的所有文件
- C语言中文件操作--如何将文本数据正确读到字符串数组中
- C语言读取文件大量数据到数组
- C语言如何实现在文件中间写数据
- c语言如何从txt文件读取数据
- 包含LOB_Data列的表删除大量数据后表及数据库文件的收缩
- C语言,如何检查文件是否存在和权限的信息
- 在Linux上,如何知道一个可执行文件是否包含调试信息呢?
- 苹果ipad教程] iTunes如何备份数据及操作文件(仅限于备份非资料库信息,第三方软件不限)
- 导入csv文件时,如果最后一列没有数据,读取出来的集合比抬头字段少,和数据中包含","如何处理?
- Ranorex--如何提取大量的测试数据
- 如何用c语言筛选出txt中含有指定字符串的数据?
- 如何使用ArcMap提取地图数据的坐标信息