Този код е за C++, някаква идея как мога да конвертирам този код в C, тъй като в C синтаксисът е доста различен [затворен]

Имам файл с име file.csv, в който има три колони и два реда. Кодирал съм да чета данните и да ги съхранявам в многоизмерен масив в C++.

// 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 Не разбирам въпроса ви. Бих създал 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 вашият strtol преобразува числото в дълго число, като по този начин се губи прецизността на началната точка. Ако го хвърлите обратно, за да изплува, това не помага, тъй като прецизността вече е загубена. Трябва да използвате strtof, което ще преобразува низа в плаващ. Така че след това не е необходим гипс. - person H_squared; 08.11.2013

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

strtol преобразува числото в дълго число, като по този начин се губи прецизността на началната точка. Ако го хвърлите обратно, за да изплува, това не помага, тъй като прецизността вече е загубена. Трябва да използвате strtof, което ще преобразува низа в плаващ. Така че след това не е необходим гипс.

person H_squared    schedule 14.11.2013