首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问一个关于内存资料移动的有关问题

2012-09-03 
请教一个关于内存资料移动的问题程序中我定义了一个指针代表一个字符数组,里面储存大量的二进位字节,我想

请教一个关于内存资料移动的问题
程序中我定义了一个指针代表一个字符数组,里面储存大量的二进位字节,
我想透过代码去把一些资料过滤出来放到另一个字符数组里,累积到一定大
小就输出到档案中,想问C语言里有类似这种指令可用吗,类似sprintf的功
能,但是要存二进位字节资料。(不要C++或MFC或.NET)

目前是自己写函式去一段一段复制过去,但是速度好慢,之前直接用fwrite
速度更慢,猜想应该是IO存取次数过多的缘故。

简单说就是读取档案到内存,在进行过滤出一段段字节串,放到新内存位址
后,取得新资料,将资料批次输出到某一档案里。

P.S 来源资料档案约100MB?1GB之间。

[解决办法]
mmap?
[解决办法]
文档存取的速度远远慢于内存数据的移动,所以你应该尽可能的减少档案读写的次数,用fread/fwrite一批批的操作,字符串处理的函数有很多,比如strcpy/strcat/sprintf/sscanf等等。
[解决办法]
可以考虑使用内存映射
[解决办法]
I/O的性能的确不高
建议减少I/O操作次数
牺牲一些内存开销
[解决办法]
仅供参考

C/C++ code
#include <stdio.h>#include <string.h>char s[256];char *p;int r,n,i;int main() {    while (1) {        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");        fgets(s,256,stdin);        if ('\n'==s[0]) break;        p=s;        while (1) {            p=strstr(p,"%20");            if (p) {                memmove(p+1,p+3,strlen(p)-3+1);                p[0]=' ';            } else break;        }        p=s;        while (1) {            p=strstr(p,"你懂得");            if (p) {                memmove(p+6,p+6,strlen(p)-6+1);                for (i=0;i<6;i++) p[i]='X';            } else break;        }        printf("%s",s);    }    return 0;}//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX"://abcdefg%20helloworld%20something.pdf//abcdefg helloworld something.pdf//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX"://这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":// 

热点排行