我有一个包含浮点数的大文件,我想阅读它们。
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);
}
答案 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个字符,因此,文件大小除以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;
}