问题描述
- c语言 从txt读取多个浮点数 并输出到另一txt
-
c语言从txt读取一百万个浮点数txt内容
-2.6225058083945892e+114
5.5865472375948137e+258
有一百万个这样的浮点数怎么能以最快速度读完,并输出到另一个txt?
怎么能快速的对这些数排序?推荐一种算法
解决方案
不管怎么说,3秒钟来不及显示。显示器每秒钟刷新60帧,每一帧显示80行数据,你算算3秒钟能显示多少数据?
排序的话,你用快速排序就可以了,全部读取到内存,也就是几十兆。
解决方案二:
怎么能快速的对这些数排序?
你说是ASCII字符来排吗?其实用格式化成浮点和用ASCII来排都一样。
先说个简单的,像上面我处理每行那样,你可以在其中加入自己的代码,这样以来我们处理对象就是一行,可以用插入法,冒泡法,选择法等,
这些都是速度慢的排序算法。
float find_min(int start, int end)
{
int i = start;
float min = 0, mf = 0.0;
for ( ; i < end; i++) {
/*
* 把这稍作修改,for (i = 0; ptr[n] != '' && ptr[n] != 'n'; i++, n++) buf[i] = ptr[n];
* 提取一行到buffer中。
* 最好把上面那行定义成宏。
* */
sscanf(buffer, "%f", &mf);
if (mf < min) min = mf;
}
return min;
}
for (i = 0; i < nm[0]; i++) {
for (j = i; j < nm[0]; j++) { // 这里就是以行为目标。
min = find_min(j, nm[0]); // 在ptr中从j到nm[0],找最小的。
fprintf(fp, "%f", min); // 在打开写入文件时用添加模式"a+"。
}
}
还有更快的排序算法就是,23树来实现,或者234树,红黑树等都可以,主要是一开始建立一个空树,在树中找要找的节点,如果没有就插入这个节点,再找再插入,插入时要保证树的平衡,就是树的高度差一般不能超过3,超过的话就旋转一下,使之再次平衡,有LL和LR这些旋转算法,实现起来将会有大量的代码,所以我就大致说下了。
有关详细的可以参考数据结构的相关书籍。
解决方案三:
scanf 读挺快的 但是你要打印到屏幕,就比较慢了。
排序有各种nlogn的排序算法使用
解决方案四:
首先把这个文件整个读入内存:
fseek(fp, 0, SEEK_END);
char* ptr = (char*) malloc(len = ftell(fp));
fseek(fp, 0, SEEK_SET);
if (ptr == NULL) return;
fread(ptr, sizeof(char), len, fp);
再把文件的'n',进行统计,看有多少行。
for (newline = 0, i = 0; i < len; i++) if (ptr[i] == 'n') newline ++;
取行的1/4,也可以取其他,这个得看你有几个CPU:
nm[0] = newline / 4;
nm[1] = nm[0];
nm[2] = nm[0];
nm[3] = newline - nm[0];
创建4个线程读取ptr中的数据并进行处理。
我以pthread为例:
static void* comp(void* args)
{
int id = *(int*)args;
char buf[0xff] = {0};
if (id == 0) {
/*
* 读取nm[0]行,并且处理。
* */
n = sscanf((char*)(ptr + n), "%s", buf);
// 对buf中的处理。
// 例如:
//
// sscanf(buf, "%f", &flt);
// fprintf(stdout, "%fn", flt);
} else if (id == 1) {
/*
* 读取nm[1]行,并且处理。
* */
// 如上面的类似。
} else if (id == 2) {
/*
* 同上
* */
} else {
// 同上
}
pthread_exit(EXIT_SUCCESS);
}
// 代码片段
for (i = 0; i < 4; i++) {
pthread_create(&td[i], NULL, comp, &td[i]);
}
for (i = 0; i < 4; i++) {
pthread_join(&td[i], NULL);
}
解决方案五:
上面的:
n = sscanf((char*)(ptr + n), "%s", buf);
忘了处理'n'了,sscanf不好,还是自己实现一个吧:
for (i = 0; ptr[n] != '' && ptr[n] != 'n'; i++, n++) buf[i] = ptr[n];
解决方案六:
上面的:
n = sscanf((char*)(ptr + n), "%s", buf);
//忘了处理'n'了,sscanf不好,还是自己实现一个吧:
for (i = 0; ptr[n] != '' && ptr[n] != 'n'; i++, n++) buf[i] = ptr[n];
解决方案七:
刚看到你这个问题,哎,这个问题的信息量就比较大了。楼上给出的答案也比较好,请采纳。
解决方案八:
直接使用打开文件的函数,按你这里来的话,直接用fread 和fwrite。排序的话建议使用快速排序
解决方案九:
如果想很快的话需要系统平台的支持,比如Windows你可以用多线程,文件异步读写,文件映射内存等等方法加速
解决方案十:
个人建议用堆排或者希尔排序或者快排,三者视情况选择。