Этот код предназначен для C++, любая идея, как я могу преобразовать этот код в C, так как в C синтаксис совершенно другой

У меня есть файл с именем file.csv, в котором есть три столбца и две строки. Я написал код для чтения данных и сохранения их в многомерном массиве на С++.

// reading csv file and storing values in matrix r 
const int rows = 10;
const int cols = 3;
ifstream file("file.csv");
if (file.is_open()) {
    float r[rows][cols];
    for (int p = 0; p < rows; ++p) {  // Reading Data from File
        for (int q = 0; q < cols; ++q) {
            file >> r[p][q];
            file.get(); // Throw away the comma from values in csv file
        }
    }

Этот код предназначен для C ++, любая идея, как я могу преобразовать этот код в C, так как в C синтаксис совершенно другой, и выбросить запятую непросто.

Изменить: файлы csv содержат значения с плавающей запятой

Спасибо :)


c csv
person user2828488    schedule 07.11.2013    source источник


Ответы (2)


Вы правы, кое-что изменится, а именно вы больше не сможете использовать потоки. Тем не менее, это довольно простая проблема.

Кроме того, на SO уже есть несколько ответов. См. ответ в этой теме: Чтение файла .CSV в C

person It'sPete    schedule 07.11.2013
comment
+1 за совет, а не за код. - person user694733; 07.11.2013
comment
Спасибо, чувак, я немного запутался в этом вопросе char* tmp = strdup(line); так как в моем случае дата файла представляет собой двумерный массив, так как я могу сохранить эти данные с помощью этой команды Еще раз спасибо :) - person user2828488; 07.11.2013
comment
@it'sPete fopen,fwrite и fread в C основаны на потоках: pubs.opengroup .org/onlinepubs/009695399/functions/fwrite.html - person H_squared; 07.11.2013
comment
@user2828488 user2828488 Я не понимаю вашего вопроса. Я бы создал синтаксический анализатор CSV с разделителем в качестве аргумента для анализа различных полей. просто используйте fgets (который основан на потоке), чтобы получить каждую строку, затем найдите 2 последовательных разделителя в массиве символов результата и сохраните их положение, затем скопируйте символы между текущим разделителем и следующим за выходом. - person H_squared; 07.11.2013
comment
извините, я имел в виду, что вы не можете использовать операторы ‹‹ и ›› - person It'sPete; 07.11.2013
comment
Спасибо. Теперь у меня есть этот код /* * Read each line from the file. */ for ( i = 0; fgets(buffer, sizeof buffer, file); ++i ) { /* * Parse the comma-separated values from each line into 'array'. */ for ( j = 0, ptr = buffer; j < ARRAYSIZE(*array); ++j, ++ptr ) { array[i][j] = (float)strtol(ptr, &ptr, 10); } } fclose(file); }, проблема в том, что он сохраняет целочисленные значения в массиве, есть ли подсказка для хранения значений с плавающей запятой в массиве? - person user2828488; 08.11.2013
comment
@user2828488 user2828488 ваш strtol преобразует число в длинное целое, тем самым теряя точность точки с плавающей запятой. Если вы вернете его обратно в float, это не поможет, поскольку точность уже потеряна. Вам нужно использовать strtof, который преобразует строку в число с плавающей запятой. Так что гипс после этого не нужен. - person H_squared; 08.11.2013

Относительно обновленного кода, который вы разместили в комментариях:

strtol преобразует число в длинное целое, тем самым теряя точность точки с плавающей запятой. Если вы вернете его обратно в float, это не поможет, поскольку точность уже потеряна. Вам нужно использовать strtof, который преобразует строку в число с плавающей запятой. Так что гипс после этого не нужен.

person H_squared    schedule 14.11.2013