请教c++编程读取.dat文件

xuxiaoxiao1900 2014-07-04 11:01:26
使用c++编程打开.dat文件后,并读取数据,但发现数据是乱码,编程代码如下所示。不知道IP_TCP_67.dat的任何信息,用记事本打开是乱码,请问打开此dat文件有专门的函数吗?具体如何编程呢?
#include "stdio.h";
#include "stdlib.h";

int main()
{
FILE*fp;
int j;
int pchData[100]={0};
fp=fopen("E:IP_TCP_67.dat","rb");
if(fp==NULL)
printf("file open error");
fread(pchData,8,100,fp);
for(j=0;j<100;j++)
{
printf("%4d\n",pchData[j]);
}
fclose(fp);
}
...全文
2780 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenglllin 2014-07-15
  • 打赏
  • 举报
回复
引用 12 楼 xuxiaoxiao1900 的回复:
[quote=引用 10 楼 fenglllin 的回复:] [quote=引用 9 楼 xuxiaoxiao1900 的回复:] 不知道其编码方式,也不知道文件中的数据格式,因此其编码变换,是否加密等等都无从可知。如果本人只想看其16进制数据,用c++如何实现呢?
读到内存中,再一个字节一个字节十六进制格式化输出就可以了。

unsigned char buf[BUFSIZ];
int i,j,ret,bytesPerLine = 10;
fread(buf,1,sizeof(buf),fp);
for (i=0;i<ret/bytesPerLine;i++)
{
   for(j=0;j<bytesPerLine;j++)
         printf("%02X ",buf[i*bytesPerLine+j]);
   putchar('\n');
}
 for(j=0;j<ret%bytesPerLine;j++)
         printf("%02X ",buf[j]);
putchar('\n');
[/quote] ret是总数吧?试过了,可以用,谢谢!不知道数据编码格式与加密方式,就无法用c++变成打开查看正确信息,是吧?[/quote] 是的
排山和倒海 2014-07-15
  • 打赏
  • 举报
回复
看16进制数据,就读取一个字节16进制表示就可以啦,不就是自己是先Hex类似这种插件了?和dat格式没有关系的
jmppok 2014-07-11
  • 打赏
  • 举报
回复
引用 楼主 xuxiaoxiao1900 的回复:
使用c++编程打开.dat文件后,并读取数据,但发现数据是乱码,编程代码如下所示。不知道IP_TCP_67.dat的任何信息,用记事本打开是乱码,请问打开此dat文件有专门的函数吗?具体如何编程呢? #include "stdio.h"; #include "stdlib.h"; int main() { FILE*fp; int j; int pchData[100]={0}; // 竟然定义int数组, 最好是char pchData[100]={'\0'}; fp=fopen("E:IP_TCP_67.dat","rb"); if(fp==NULL) printf("file open error"); fread(pchData,8,100,fp); // 读的有误, 不是8,100, 应该是sizeof(int),100 for(j=0;j<100;j++) { printf("%4d\n",pchData[j]); // 把数据,每4个字节按int输出, 奇葩阿 } fclose(fp); }
这段代码作用是啥?是输出文件内容? 输出内容可以直接 FILE * f = fopen(); int tmp = fgetchar(f); while (tmp != EOF) { printf("%c",tmp); tmp = fgetchar(f); }
「已注销」 2014-07-11
  • 打赏
  • 举报
回复
既然是编程创建的,那最好用程序打开
xuxiaoxiao1900 2014-07-08
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
用wireshark软件打开试试。
试过了,没用,还有别的吗?
xuxiaoxiao1900 2014-07-08
  • 打赏
  • 举报
回复
引用 14 楼 u013823973 的回复:
fread(pchData,8,100,fp); 越界了
什么意思?没明白
难题 2014-07-07
  • 打赏
  • 举报
回复
fread(pchData,8,100,fp); 越界了
赵4老师 2014-07-07
  • 打赏
  • 举报
回复
用wireshark软件打开试试。
xuxiaoxiao1900 2014-07-07
  • 打赏
  • 举报
回复
引用 10 楼 fenglllin 的回复:
[quote=引用 9 楼 xuxiaoxiao1900 的回复:] 不知道其编码方式,也不知道文件中的数据格式,因此其编码变换,是否加密等等都无从可知。如果本人只想看其16进制数据,用c++如何实现呢?
读到内存中,再一个字节一个字节十六进制格式化输出就可以了。

unsigned char buf[BUFSIZ];
int i,j,ret,bytesPerLine = 10;
fread(buf,1,sizeof(buf),fp);
for (i=0;i<ret/bytesPerLine;i++)
{
   for(j=0;j<bytesPerLine;j++)
         printf("%02X ",buf[i*bytesPerLine+j]);
   putchar('\n');
}
 for(j=0;j<ret%bytesPerLine;j++)
         printf("%02X ",buf[j]);
putchar('\n');
[/quote] ret是总数吧?试过了,可以用,谢谢!不知道数据编码格式与加密方式,就无法用c++变成打开查看正确信息,是吧?
fenglllin 2014-07-05
  • 打赏
  • 举报
回复
更正一下 后面那个 printf中的buf[j]应该是buf[i*bytesPerLine+j]
fenglllin 2014-07-05
  • 打赏
  • 举报
回复
引用 9 楼 xuxiaoxiao1900 的回复:
不知道其编码方式,也不知道文件中的数据格式,因此其编码变换,是否加密等等都无从可知。如果本人只想看其16进制数据,用c++如何实现呢?
读到内存中,再一个字节一个字节十六进制格式化输出就可以了。

unsigned char buf[BUFSIZ];
int i,j,ret,bytesPerLine = 10;
fread(buf,1,sizeof(buf),fp);
for (i=0;i<ret/bytesPerLine;i++)
{
   for(j=0;j<bytesPerLine;j++)
         printf("%02X ",buf[i*bytesPerLine+j]);
   putchar('\n');
}
 for(j=0;j<ret%bytesPerLine;j++)
         printf("%02X ",buf[j]);
putchar('\n');
幻夢之葉 2014-07-04
  • 打赏
  • 举报
回复
dat只是一个格式后缀名,没有什么标准。 不像bmp之类的已经标准化了的。 读取dat文件主要得看该文件是以什么数据格式写入,是否进行编码变换,加密等等。
caozl 2014-07-04
  • 打赏
  • 举报
回复
1. 这个DAT文件里是什么数据 是什么软件保存的? 2. 用16进制编辑器打开查看 比如用UltraEdit
xuxiaoxiao1900 2014-07-04
  • 打赏
  • 举报
回复
不知道其编码方式,也不知道文件中的数据格式,因此其编码变换,是否加密等等都无从可知。如果本人只想看其16进制数据,用c++如何实现呢?
我看你有戏 2014-07-04
  • 打赏
  • 举报
回复


#include "stdio.h"
#include <stdlib.h>
int average(char *pFilePath);
void main()
{
	FILE *fp;
	int nData[10];
	for(int i=0;i<10;i++)
	{
		printf("请输入第%d个数:",i+1);
		scanf("%d",nData+i);
	}
	fp = fopen("c:\\data.txt", "wb");//b表示以二进制的形式写入文件
	if(fp!=NULL)
	{
		fwrite(nData,sizeof(int),10,fp);
		fclose(fp);
		//写完文件后,可以看一下文件大小,40个字节,
		//其实就是数组的大小  sizeof(int)*10 = 40   以前在学校里没搞明白的问题,现在明白了
	}

	printf("平均值大小:%d\n",average("c:\\data.txt") );


	system("pause");
}

int average(char *pFilePath)
{
	int nData[10]={0};
	FILE *fp;
	fp = fopen(pFilePath, "rb");//b表示以二进制的形式
	if(fp!=NULL)
	{
		fread(nData,sizeof(int),10,fp);
		fclose(fp);	
	}
	else
	{
		printf("读取文件出错了...");
		return 0 ;
	}

	int nSum = 0 ;
	for(int i=0;i<10;i++)
	{
		printf("第%d个数:\t内存地址%8x\t值:%d\n",i+1,nData+i,*(nData+i));
		nSum += *(nData+i) ;
	}
	return nSum/10;
}

//  http://vs2003.net   
//  have a look
程序员-阿乐 2014-07-04
  • 打赏
  • 举报
回复
直接输出字符呢,你现在输出不是整型数字吗?
yangyunzhao 2014-07-04
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
[quote=引用 4 楼 yangyunzhao 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
如果他不预先知道编码方式,就算看到了16进制数据,也没有意义啊[/quote] 在此基础上猜。[/quote] 也是 我现在只能猜出sqlite数据库的数据文件
赵4老师 2014-07-04
  • 打赏
  • 举报
回复
引用 4 楼 yangyunzhao 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
如果他不预先知道编码方式,就算看到了16进制数据,也没有意义啊[/quote] 在此基础上猜。
yangyunzhao 2014-07-04
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
如果他不预先知道编码方式,就算看到了16进制数据,也没有意义啊
赵4老师 2014-07-04
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧