如何用C语言输出paraview能够直接读取的数据文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用C语言输出paraview能够直接读取的数据文件?相关的知识,希望对你有一定的参考价值。

原来进行数据后期处理时用的都是tecplot,它能直接读取C语言输出的保存在txt文档下的数据;最近需要换成paraview来进行数据后期处理,但是paraview不能load 文本文档,它的主要数据来源是VisualizationToolkit(VTK),所以我想知道VTK文档的数据结构,或者怎样用C语言输出能满足paraview标准的数据文档。

你去谷歌"vtk file format pdf"下载一个pdf文档,里面是对vtk数据格式的说明,按照这个说明写个C Code把数据输入进一个*.vtk的文件,然后在paraview里面导入这个文件就好了。我不知道怎么在百度知道里面上传文件,所以附上这个pdf文档的截图以供参考。

参考技术A 不能

如何用c语言输出地址的内容,如下所示:

我通过debug查看了一段地址的内容如下:

FFFF:0100 E1 01 D5 00 44 02 AE 01-E1 01 E1 01 49 02 49 02 ....D.......I.I.
FFFF:0110 7B 02 E1 01 E1 01 B5 02-DB 02 E1 01 01 03 E1 01 ...............
FFFF:0120 E1 01 30 03 E1 01 E1 01-E1 01 E1 01 E1 01 66 03 ..0...........f.
FFFF:0130 0B E1 01 E1 01 E1 01 D5-00 83 03 AB 03 E1 01 E2 ................
FFFF:0140 03 EA 03 EA 03 CB 03 0A-E1 01 E1 01 E1 01 D5 00 ................
FFFF:0150 D5 00 AE 01 E1 01 E1 01-D5 00 D5 00 E3 06 E8 05 ................
FFFF:0160 00 AA E2 FA F8 C3 8A 26-06 01 32 C0 86 06 0C 00 .......&..2.....
FFFF:0170 0A C0 75 2A CD 16 0B C0-74 EC 3D 00 72 75 04 B0 ..u*....t.=.ru..

现在我想把FFFF:1070~FFFF:017F的内容以两种方式输出来,输出形式为:
/*******************************************************************************************
输出方式一:0170 0A C0 75 2A CD 16 0B C0-74 EC 3D 00 72 75 04 B0
输出方式二:..u*....t.=.ru..
press any key to contiune!
*******************************************************************************************/

请直接在我的这个程序上改:

#include<stdio.h>

void main()
char *p = NULL;
p = (char *) ((long *)0x13F5C);
printf("%c",p);

一楼的,你那个我不需要运行就知道你的不太合理了,段地址+偏移地址都没计算就那样?

数在内存中结构。
下面引用一下百度知道里面搜到的内容来方便说明:
===================
来源:

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是 little endian呢?

其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。

用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
===================
C语言中float,double等类型,在内存中的结构
来源:
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更

高的精度。

任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2

字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒

序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。

目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和

尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:

````````符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
临时数 1 15 64 80

由于通常C编译器默认浮点数是double型的,下面以double为例:
共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
最高位63位是符号位,1表示该数为负,0正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。

按照IEEE浮点数表示法,下面将把double型浮点数38414.4转换为十六进制代码。
把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了(隐藏位技术:最高位的1

不写入内存)。
如果你够耐心,手工算到53位那么因该是:38414.4(10)=1001011000001110.0110101010101010101010101010101010101(2)
科学记数法为:1.001……乘以2的15次方。指数为15!
于是来看阶码,一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023,在这里,

15+1023=1038。二进制表示为:100 00001110
符号位:正—— 0 !
合在一起(尾数二进制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按字节倒序存储的十六进制数就是:
55 55 55 55 CD C1 E2 40

===================
我们普遍使用的Intel x86系列的CPU的PC机上运行的程序是采用little endian方式存储数据。
以x为上面例子中的38414.4为例来说明:
问题中经int型(4个字节)指针变量p取得x的地址后,*p的值就是从低地址开始的前四个字节组成的int型变量:0x55555555。
再赋值给double型的y,那么y的值就是以0x55555555为整数部分的浮点数了。

x = 100.1的情况可以在VC上查看内存得到其在内存中的值,低地址开始的四个字节是 66 66 66 66,所以*p = 0x66666666 = 1717986918。以%f的格式控制符打印输出的小数部分保留6位有效数字,并且禁止以指数形式输出浮点数,所以结果就是:
1717986918.000000
另外,虚机团上产品团购,超级便宜
参考技术A lz,最好用汇编来读取地址内容并通过C语言输出。因为你不知道指针的值究竟代表什么含义,只能在汇编中用es + si来读取本回答被提问者采纳 参考技术B 1、%p 直接用16进制地址形式输出地址
%d 把地址直接用10进制形式输出
char a[] = "hellow C++";
int b[] = 0x01,0x02,4,0x08,0;

2、例如下面几种输出地址方法:
printf("十进制地址%d 十六进制地址%p", a, a);
printf("十进制地址%d 十六进制地址%p", b, b);
printf("十进制地址%d 十六进制地址%p", &a[0], &a[0]);
printf("十进制地址%d 十六进制地址%p", &b[0], &b[0]);
参考技术C #include<stdio.h>

void main()
char *p = NULL;
printf("0170: ");
for (p = (char *) ((long *)0x100160);p<=(char *)0x10016F;p++)
printf("%X ",*p);
putchar('\n');
for (p = (char *) ((long *)0x100160);p<=(char *)0x10016F;p++)
printf("%c",*p);
参考技术D %x
%s

以上是关于如何用C语言输出paraview能够直接读取的数据文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何用C语言实现,读取两个文件数据,然后比较两个数据,如果有不同,转换类型并输出???

如何用c语言printf输出bmp图片的像素信息。

如何用C语言读取txt文件中的数据到结构体数组中

如何用c语言输出地址的内容,如下所示:

如何用C语言统计一个数据文件中的数据个数

如何用C语言读取txt文档中最后一行数据