WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > VC/MFC

关于内存映射文件的处理问题
[ 来源:ITWENKU 时间:2007-4-18 14:30:13 | 浏览:363人次 ]

我用MapViewOfFile()得到一个大文本文件的内存映射地址,
可我不知道如何获取其中的数据,比如获取一个(行)double类型的数据?

逐个获取数据是不是会降低内存映射的性能?

请大虾们提示,谢谢!


把无类型指针强制转换成double或某类型指针,就可以按照你的要求获取数据了;其实类型就是说明了多大的内存块


文本文件可以用CStdioFile


谢谢解答!
映射获取LPBYTE lpbMapAddr= (LPBYTE)MapViewOfFile
(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);

to axing941021(洵),用double强制转换:A=(double)(*lpADS);只是得到地址址啊.而且对于一行有多个数据时,怎么获取啊?

to goodboyws(深夜不眠者(VCMVP)),是不是利用MapViewOfFile很难逐行得到具体值啊? 利用CStdioFile效率是不是类似CFile啊?


你不如给一段样本数据来看看


如果,你的数据是连续的( sizeof(double) )
那,就可以 A= *( (double*)lpADS + (sizeof(double) * i) )





样本数据如:
423456.78 235456.78 145477.321
435345.234 23423543.12 4545456.32
343545.45 245435354.4 453453.66
3453456.47 54543544.54 4534533.12
……

A= *( (double*)lpADS + (sizeof(double) * i) )也的不到正确的数据啊,是不是我的lpbMapAddr定义不正确,我改成其他类型的也无法正确获取。


估计,LZ的数据是文本格式的('4' != 4)。
并且,每个数据的字节长度不同。

这样话,就得每次取一个字符,然后再判断了。

LZ还可以试着写double型的二进制值。





怎么根据地址lpADS,取值呢?逐行判断回车和换行吗?


char* buf = (char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
char* line = buf;
long data[3];
int readnum;

while( line && (line < buf+filesize) )
{
// read three float data from one text line
readnum = sscanf(line, "%f %f %f", &data[0], &data[1], &data[2]);

// stop if none data is readed
if( readnum==0 ) break;

// process the data
ProcessRecord(data, readnum);

// move line to the next line
line = strstr(line, "\r\n");
}


既然得到了指针,逐个字符判断空格和回车来断开字符串,也可以用CStdioFile逐行读入再判断分割字符串。分割字符串可以用CString::Tokenize()函数。


>= '0' && <= '9' || == '.'


把一行数据的内容定义一个结构体T,就有一个结构体指针比如:T*
T* lpbMapAddr= (T *)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
通过lpbMapAddr就可以获取一行数据了,通过指针移动就可以得到其他行了,不知道我的理解对不对?



基本正确


和其他方式的文件操作基本一样


遍历内存就好了 如果字符不为空格 那就读取 直到为空格了 就把这段保存起来 。




LZ说的是"一个大文本文件",文件中应该是字符串表示形式的数据,要获取一个(行)double类型的数据

我上面贴的代码有毛病,类型没用对,下面是测过的

const char* sample =
"423456.78 235456.78 14545677.321\r\n"
"435345.234 23423543.12 4545456.32\r\n"
"343545.45 245435354.4 453453.66\r\n"
"3453456.47 54543544.54 4534533.12";

void ScanData()
{
char* buf = (char*)sample;
char* line = buf;
double data[3] = {0};
int readnum;
int size = strlen(buf);

while( line && (line < buf+size) )
{
// read three float data from one text line
readnum = sscanf(line, "%lf %lf %lf", &data[0], &data[1], &data[2]);

// stop if none data is readed
if( readnum==0 ) break;

// process the data
printf("%lf %lf %lf\r\n", data[0], data[1], data[2]);

// move line to the next line
line = strstr(line, "\r\n");
if(line) line+=2;
}
}


memcpy

 相关文章
·windows编程应该如何学习?
·在控件中绘图怎么不显示
·GetTextExtentPoint32无法正确取出场景上的字符宽
·在DrawText前先计算出text的输出区域?
·一起探讨关于进程隐藏的话题
·请教在VC里能不能通过PC串口转IIC通讯?

 最新更新
关于内存映射文件的处理问题
要做一个播放264文件的程序。请高手给指指路了,谢谢
CTreeCtrl控件叶节点的区分问题,请高手帮忙
服务中用远程线程为什么报内存不能为"written"呢?
没有column header的CListCtrl的数据添加
串口程序
用tinyxml读取XML文件时,在读了一段数据后怎样继续读取第二段数据的头节点?
怪事内存映射文件,没有FlushViewOfFile,也可以保存到文件?
用C实现Ping程序
对ini文件的写入字符
如此动态创建CEdit(在CWnd上),为什么显示是平坦的?没有BORDER?。。
new的问题
 版权所有:中国IT问库
copyright © 2006 www.itwenku.com all rights reserved.