我用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
|