sscanf не может прочитать двойной гекс - PullRequest
2 голосов
/ 01 мая 2019

Мне нужно сохранить точное двоичное представление некоторых двойников в текстовом файле с другими значениями ascii, поэтому я использую "% a", как предложено в этом вопросе.

fprintf (pFile, "Scale: %a, %a, %a\n", scale.x, scale.y, scale.z);

Однако, когда я пытаюсь прочитать его с помощью "% la", scanf возвращает 0 прочитанных элементов.

double x=0, y=0, z=0;
fgets(buf, sizeof buf, pFile);
int test = sscanf (buf, "Scale: %la, %la, %la\n", &x, &y, &z);
// test is zero!

Когда я открываю отладчик, я вижу, что строковый буфер точно такой, как я ожидал.

buf ... "Масштаб: 0x1.fc70e3p-1, 0x1.fc70e3p-1, 0x1.fc70e3p-1 \ n" ... символ [1000]

Так почему же он не может прочитать это?

По просьбе Нейт Элдредж , вот моя версия MCVE:

#include <stdio.h>
int main(int argc, char *argv[])
{
    double x=0, y=0, z=0;
    const char* buf = "Scale: 0x1.fc70e3p-1, 0x1.fc70e3p-1, 0x1.fc70e3p-1\n";
    int test = sscanf(buf, "Scale: %la , %la , %la", &x, &y, &z);
    // test is zero!
}

Примечание: я использую MS Visual Studio 2013

Второе примечание: мне нужно отправить исходный код и файлы данных третьей стороне, у которой есть собственный компилятор. Поэтому формат сохранения должен быть относительно независимым от платформы.

1 Ответ

1 голос
/ 01 мая 2019

Microsoft VS2013 strtod, sscanf и istringstream и т. Д. не реализовали стандарт c99 c ++ 11, и они не могут анализировать шестнадцатеричные числа с плавающей запятой или шестнадцатеричные числаdoubles.

...