C中的快速双文件读取

时间:2017-04-09 11:57:56

标签: c file io

我有一个包含浮点数的大文件,我想阅读它们。

   52.881 49.779 21.641 37.230 23.417 7.506 120.190 1.240 79.167 82.397 126.502 47.377 112.583 124.590 103.339 5.821 24.566 38.916 42.576 

这只是文件的开始。它有10000000个数字。

我收到了这段代码,但我不知道如何打印这些数字。

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <fcntl.h>
#include <sysexits.h>
#include <unistd.h>

int main()
{
    int fd; 
    size_t bytes_read, bytes_expected = 1000000*sizeof(double); 
    double *data;
    char *infile = "file.dat";

    if ((fd = open(infile,O_RDONLY)) < 0) 
        err(EX_NOINPUT, "%s", infile);

    if ((data = malloc(bytes_expected)) == NULL)
        err(EX_OSERR, "data malloc");

    bytes_read = read(fd, data, bytes_expected);

   if (bytes_read != bytes_expected) 
       err(EX_DATAERR, "Read only %d of %d bytes", 
         bytes_read, bytes_expected);

   /* print all */

   free(data);

   exit(EX_OK);
}

2 个答案:

答案 0 :(得分:2)

您正在尝试读取文本文件,就好像数据是二进制文件一样,因此您将读取一些字节,但存储在数组中的<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.js"></script> <canvas id="barChart" width="400" height="200"></canvas>值将不是您要从文件中读取的值,你可能会这样做

double

答案 1 :(得分:-1)

既然你想要一个快速的解决方案,也许你必须牺牲记忆 读取文件的更快方式是二进制形式 因此,我会用一种有效的方法获得文件大小,
然后我会相应地分配内存,
将整个文件上传到内存的想法 在那里,由于内存读取比文件读取快,
使用sscanf(...)可以快速读取数据 我们还可以观察到每个浮点数为
需要至少3个字符才能存储在文本文件中:

  • 点('.')的1个字符,
  • 一些数字的字符,
  • 和1个字符 用于将值与其中的成功者分隔开的空格(&#39;&#39;) 文件。

因此,文件大小除以3将是双精度数组大小的上限。

#include <stdio.h>
int main(void) {
  char *filename = "file.dat";
  FILE *F = fopen(filename, "rb");
  fseek(F, 0L, SEEK_END);
  long int filesize = ftell(F);
  rewind(F);
  char *data = malloc(filesize+1);
  fread(data, filesize, 1, F);
  data[filesize] = '\0';                              // End of string, just in case
  fclose(F);

  // The desired data will be stored in array:  
  double *array = malloc(sizeof(double) * filesize/3);

  int ret;
  int n;       // represents the no chars in a sscanf(...) reading
  double *a = array;
  while (1) {      // Infinite loop...
    ret = sscanf(data, " %lg%n", a, &n);
    if (ret == EOF) break;   // <<---- EXIT POINT of the loop
    a++;
    data += n;
  }

  long int array_size = a - array + 1;
}