您的位置:首页 > 编程语言 > C语言/C++

如何用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窗口显示提取的数据。
#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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐