ベクトルのエントリが格納されている ASCII ファイルがあります。ファイルの長さ (行数) はわかりません。また、数行から数万行まで大きく異なる可能性があるため、そのサイズについての見積もりもありません。そのファイルに保存されているデータを読み取り、それらを float* 変数にロードする効率的な方法が必要です。コードは C である必要があります。
私の質問は、事前にサイズがわからない場合に、作成する必要があるベクターにメモリを割り当てる方法ですか? 例を教えてください。
最後に、そのような関数の最も適切なプロトタイプは何だと思いますか? 次のようなものにする必要があります。
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 行のファイルで試してみたところ、問題なく動作しているようです。お気軽にコメントください。