gpt4 book ai didi

c - 如何将文件中的数据加载到C中的float*中

转载 作者:行者123 更新时间:2023-11-30 15:52:24 25 4
gpt4 key购买 nike

我有一个 ASCII 文件,其中存储了 vector 的条目。我不知道文件的长度(行数),也无法估计其大小,因为它可能从几行到几万行不等。我需要一种有效的方法来读取该文件中存储的数据并将它们加载到 float* 变量中。代码应该是 C 语言。

我的问题是,如果我事先不知道它的大小,如何为我需要创建的 vector 分配内存?能举个例子吗?

最后,您认为此类函数最合适的原型(prototype)是什么?应该是这样的:

load_data(const char* filename, float* data, int* vector_size);

更新 1:在进行一些初始测试时,我编写了以下代码:

void create_random_matrix(float* matrix, const int nrows) {
matrix = (float *) malloc(sizeof (float) * nrows);
short i;
for (i = 0; i < nrows; i++) {
matrix[i] = 7.0f;
}
}

它应该返回一个数组,其所有元素都等于 7.0f。相反,当我从 main.c 调用它时:

float *a;
create_random_matrix(a, 10);
printf("%f",a[0]);

它打印0.0f。这怎么可能?!

更新 2。如果没有您的帮助,就不会编写以下(工作)代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define LINE_SIZE 10
#define ALLOCATION_CHUNK 50

int load_vector_data(const char* filename, float** vector, int* length) {
*vector = malloc(sizeof (float) * ALLOCATION_CHUNK);
int allocated_rows = ALLOCATION_CHUNK;
u_short i = 0;
FILE* fr = fopen(filename, "r");
if (fr == NULL) {
exit(FILE_NOT_FOUND);
}
char line[LINE_SIZE];
while (fgets(line, LINE_SIZE, fr) != NULL) {
if (i >= allocated_rows){
allocated_rows += ALLOCATION_CHUNK;
*vector = realloc(*vector, sizeof (float) * allocated_rows);
}
strip_newline(&line, LINE_SIZE);
(*vector)[i] = strtod(line, (char **) NULL);
i++;
}
*length = i;
*vector = realloc(*vector, sizeof (float) * i);
fclose(fr);
}

void strip_newline(char *str, int size) {
u_short i;
for (i = 0; i < size; ++i) {
if (str[i] == '\n') {
str[i] = '\0';
return;
}
}
}

我尝试了一个 8000 行的文件,似乎工作得很好!请随意发表评论。

最佳答案

fgets你是从文件中读取数据的 friend 吗(如果我假设每一位数据都在换行符上是正确的)。逐一读取每一行并使用 strtof在你读到的文字上。读取文本并转换为 float 本质上是一个缓慢的过程,因此我认为上述内容已经足够好了。

关于你的第二个问题,有几种方法可以做到。您可以传递一个 float** 并在函数内进行 malloc。尽管这有一个缺点,您需要在函数之外释放它,但这并不完全明显。我能想到的唯一其他方法是扫描文件并计算换行符的数量,然后为此预先分配数组长度。

很难说进行 malloc 和一堆 realloc 是否比扫描来计算行数更有效,可能值得尝试这两种方法(都不是特别困难)并看看哪一种方法更有效为您提供更快的速度。

关于c - 如何将文件中的数据加载到C中的float*中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com