Преобразование строк из CSV-файла в удвоение - PullRequest
0 голосов
/ 24 января 2019

Возникли проблемы с преобразованием строк в удвоения.Я пытался использовать strtod, но это то же самое.Кажется, что это должно работать, просто найти, но, возможно, использование strtok как-то связано с этим.data[i].calories - это двойное число, конечно.

data[i].calories = atof(strtok(NULL, ","));

Кажется, что для калорий назначается либо положительное, либо отрицательное действительно большое число (двойное, что означает, что оно должно неправильно читать значение.

Ожидаемые данные:

12cx7,23: 55: 00, -> 0,968900025, (это также может быть двойное число), 0,74,0,2,

Что он вместо этого фактически получает:

12cx7,23: 55: 00, -> - 537691972,0,0,74,0,2,

РЕДАКТИРОВАТЬ:

IM ANИдиот, я его отображал как INT PFFFFFFFFFFFFFFFF.

1 Ответ

0 голосов
/ 01 февраля 2019

Предполагая, что у нас есть такой ввод,

12cx7,23: 55: 00,0.968900025,, 0,74,0,2,

И мы бы хотели,

"Возникли проблемы с преобразованием строк в удвоения."

То есть мы хотели бы отделить буквенно-цифровые данные. А затем оставшиеся целые числа и числа с плавающей запятой, мы хотели бы напечатать в правильном формате, я бы сделал что-то вроде следующего:

#include <cstring>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int isNumeric (const char * s)
{
    if (s == NULL || *s == '\0' || isspace(*s)) {
      return 0;
    }
    char * p;
    strtod (s, &p);
    return *p == '\0';
}

bool isInteger(double val)
{
    int truncated = (int)val;
    return (val == truncated);
}

int main() {
    // If this is your input:
    char input[100] = "12cx7,23:55:00,0.968900025,0,74,0,2,";
    // Then step 1 -> we split the values
    char *token = std::strtok(input, ",");
    while (token != NULL) {
        // Step 2 -> we check if the values in the string are numeric or otherwise
        if (isNumeric(token)) {
            // printf("%s\n", token);
            char* endptr;
            double v = strtod(token, &endptr);
            // Step 3 -> we convert the strings containing no fractional parts to ints
            if (isInteger(v)) {
                int i = strtol(token, &endptr, 10);
                printf("%d\n", i);
            } else {
                // Step 4 -> we print the remaining numeric-strings as floats
                printf("%f\n", v);
            }
        }
        else {
            // What is not numeric, print as it is, like a string
            printf("%s,",token);
        }
        token = std::strtok(NULL, ",");
    }
}

Для функции isInteger() я взял идею / код из этого принятого ответа. Все остальное довольно оригинально и, вероятно, может быть улучшено / улучшено.

Затем выдается такой вывод:

12cx7,23: 55: 00,0.968900,0,74,0,2,

Это в основном вывод, который нам нужен, за исключением очень важного различия в том, что на входе была целая строка, а на выходе получаются двойные / плавающие числа, целые числа и строки, правильно идентифицированные и напечатанные с правильным форматированием.

EDIT

Я не занимаюсь обработкой ошибок здесь. Этот код просто для того, чтобы дать ОП подтверждение концепции. Проверять и контролировать любые ошибки, возвращаемые используемыми функциями strtoX.

...