文件读取-c语言 从txt读取多个浮点数 并输出到另一txt

问题描述

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你可以用多线程,文件异步读写,文件映射内存等等方法加速

解决方案十:

个人建议用堆排或者希尔排序或者快排,三者视情况选择。

时间: 2024-08-19 16:02:11

文件读取-c语言 从txt读取多个浮点数 并输出到另一txt的相关文章

豆瓣-关于C语言按行读取文件,读取其中数字,挨个转换成doube类型,存入数组

问题描述 关于C语言按行读取文件,读取其中数字,挨个转换成doube类型,存入数组 int main() { FILE *fp; char buffer[50]; char filename[50]; int bufferLen; int i; int j = 0; char c; double c_number[50]; printf("Input file name: "); scanf("%s", filename); if((fp = fopen(filen

文件读取-怎么把-1.1675264738839661e-025格式的浮点数从txt读取?

问题描述 怎么把-1.1675264738839661e-025格式的浮点数从txt读取? 怎么把-1.1675264738839661e-025格式的浮点数从txt读取? c语言 解决方案 直接读取,split切分,itof转换成浮点数. 解决方案二: 人家问的是C,居然有人用CPP??!!! 我做个例子: #include int main(int argc,char** argv) { float flt = 0.0; if (argc == 2) { sscanf(argv[1], "%

c语言为什么fread读取失败

问题描述 c语言为什么fread读取失败 #include #include #include #define STUDLEN sizeof(student)typedef struct _student{ char name[10]; char sex[5]; float weight; float high; struct _student *next;}student;void Free(student *head); void input(){ student *head=NULL,*p

文件读取-Android jni c++ 如何读取jni文件夹下的文件?

问题描述 Android jni c++ 如何读取jni文件夹下的文件? 在一个jni工程中,jni文件夹的结构如下: jni |--Android.mk |--Application.mk |--filer.h |--file.cpp |--res.txt file.cpp里边的代码如下: #include ""filer.h""#include <fstream>#include <string>using namespace std;j

asp.net程序来读取多语言版本Ini配置文件

这是asp.net程序来读取多语言版本Ini配置文件的开发示例,主要分为以下三个部分: 1. Ini 配置文件 2. 读取Ini配置文件的DLL 3. Web页面调用与内容显示 4. 数据库表T_User,如右图 首先说明一下Ini 文件格式:如下图其中[M_Index]节点和该节点下的所有的key和value,其中[M_Index]节点的名称是对应开发示例中的每个页面所在的文件夹名称的第一个字母加下划线再加该页面的名称组合而成,如 M_Index 则表示Manager文件夹下面有一个Index

c语言以二进制读取图片问题

问题描述 c语言以二进制读取图片问题 小弟新手刚学数字图像处理,现在需要做一个模板卷积 程序编完了 但是对图片的处理总是不对 我把图片不做模板卷积只是读进去在存出来,发现图片已经变化了. 但是查了很久fread函数和fwrite函数,不知道哪里错了 大神们求拯救帮忙看看 程序很简单 define的想法就是用一维数组表示二维数组 #include using namespace std; #define Twoto1(i,j,w) i*w+j void createimage(unsigned c

c# 入门 txt读取 绘画-c#txt读取并绘制其中所表示的线段

问题描述 c#txt读取并绘制其中所表示的线段 txt文件如下 1 1,1 2,18 3,16 END 2 3,1 4,19 END END 以上代表两条线,ID为1的线由(1,1)(2,18)(3,16)相连,以END为结束,ID为2的线由(3,1)(4,19)相连,以END为结束,读取完毕以END结束 要求在c#窗体程序中绘制txt文件中所表示的线段. 解决方案 界面是一个panel和一个打开文件的按钮,在panel里绘制线段 using System; using System.Colle

一起谈.NET技术,asp.net程序来读取多语言版本Ini配置文件

这是asp.net程序来读取多语言版本Ini配置文件的开发示例,主要分为以下三个部分: 1. Ini 配置文件 2. 读取Ini配置文件的DLL 3. Web页面调用与内容显示 4. 数据库表T_User,如右图  首先说明一下Ini 文件格式:如下图其中[M_Index]节点和该节点下的所有的key和value,其中[M_Index]节点的名称是对应开发示例中的每个页面所在的文件夹名称的第一个字母加下划线再加该页面的名称组合而成,如 M_Index 则表示Manager文件夹下面有一个Inde

文件或目录损坏且无法读取的解决方法

方法很简单,用chsdsk命令即可 详解如下: 开始--运行--输入cmd--输入chkdsk 盘符: /f 等命令运行完即可. 这里要注意的是,那个冒号后面要空一格,别跟着就写"/f" 无法打开H盘,文件或目录损坏且无法读取 故障现象 不管是移动硬盘还是优盘,包括本地电脑上的硬盘分区,双击打开时,提示:"无法打开H盘 ,文件或目录损坏且无法读取,....".有的分区格式变为RAW. 数据丢失原因分析 出现这种错误提示,是由于各种原因导致的磁盘文件目录(FAT,MF