Вот общий подход в C для чтения файла в массив cstrings (указатели на cstrings, поэтому грубый эквивалент списка строк Python).
int count = 0; // line counter;
int char_count = 0; // char counter;
int max_len = 0; // for storing the longest line length
int c; // for measuring each line length
char **str_ptr_arr; // array of pointers to c-string
//extract characters from the file, looking for endlines; note that
//the EOF check has to come AFTER the getc(fp) to work properly
for (c = getc(fp); c != EOF; c = getc(fp)) { //edit see comments
char_count += 1;
if (c == '\n') { //safe comparison see comments
count += 1;
if (max_len < char_count) {
max_len = char_count; //gets longest line
}
char_count = 0;
}
}
//should probably do an feof check here
rewind(fp);
Итак, теперь у вас естьколичество строк и длина самой длинной строки, (Вы можете попробовать использовать цикл выше, чтобы исключить строки, если хотите, но может быть проще прочитать все это в массив из c-строк, а затем обработать это в массивдвойников). Теперь выделите память для массива указателей на c-строки и для самих c-строк:
//allocate enough memory to hold all the strings in the file, by first
//allocating the arr of ptrs then a slot for each c-string pointed to:
str_ptr_arr = malloc(count * sizeof(char*)); //size of pointer
for (int i = 0; i < count; i++) {
str_ptr_arr[i] = malloc ((max_len + 1) * sizeof(char)); // +1 for '\0' terminate
}
rewind(fp); //rewind again;
Теперь у нас есть проблема, заключающаяся в том, как заполнить эти cstrings (Python намного проще!). Это работает, я не уверен, что это экспертный подход, но здесь мы читаем во временный буфер, а затем используем strcpy для перемещения содержимого буфера в наши выделенные слоты массива:
for (int i = 0; i < count; i++) {
char buff[max_len + 1]; //local temporary buffer that can store any line in file
fscanf(fp, "%s", buff); //read the first string to buffer
strcpy(str_ptr_arr[i], buff);
}
Примечание: этоявляется достойной точкой, с которой нужно начинать исключать строки или удалять различные подстроки из строк, так как вы можете сделать strcpy условным для содержимого буфера, используя другие методы cstring. Я сам новичок в этом (учусь писать функции C для использования в программах Python), но, похоже, это правильный подход.
Возможно также, что можно напрямую перейти к динамически распределенному массивус плавающей запятой для хранения ваших числовых данных без использования массива cstring;это можно сделать в последнем цикле выше. Вы можете разбить строки на пробел, исключить алфавитные части и использовать функцию cstring atof для преобразования в тип данных с плавающей точкой.
Редактировать: я должен упомянуть, что все эти выделения памяти должны быть освобождены вручную, когда вы закончите с нимии вот подход:
for(int i = 0; i < count; i++) { // free each allocated cstring space
free(str_ptr_arr[i]);
}
free(str_ptr_arr); // free the cstring pointer space
str_ptr_arr = NULL;