fscanf не читает / не распознает числа с плавающей точкой? - PullRequest
4 голосов
/ 25 октября 2019

Я пытаюсь прочитать из файла, который имеет формат:

 ID: x y z ...... other crap 

Первая строка выглядит следующим образом:

 0: 0.82 1.4133 1.89 0.255 0.1563 armTexture.jpg 0.340 0.241 0.01389

Мне нужны только числа с плавающей запятой XYZ,остальная часть линии - мусор. Мой код в настоящее время выглядит следующим образом:

int i;
char buffer[2];
float x, y, z;

FILE* vertFile = fopen(fileName, "r");      //open file
fscanf(vertFile, "%i", &i);                 //skips the ID number
fscanf(vertFile, "%[^f]", buffer);      //skip anything that is not a float (skips the : and white space before xyz)

//get vert data
vert vertice = { 0, 0, 0 };
fscanf(vertFile, "%f", &x);
fscanf(vertFile, "%f", &y);
fscanf(vertFile, "%f", &z);

fclose(vertFile);

Он был немного изменен для отладки (первоначально первые два scanfs * использовали для игнорирования ввода).

Когда я запускаю это, x,у, г не меняются. Если я сделаю это

int result = fscanf(vertFile, "%f", &x);

, то результат будет равен 0, что, как мне кажется, говорит мне, что он вообще не распознает числа как числа с плавающей точкой? Я попытался переключить xyz на удвоения и использовать% lf, но это тоже не сработало.

Что я мог сделать не так?

1 Ответ

5 голосов
/ 25 октября 2019

%[^f] не пропускает non-float, он пропускает все, что не является буквой 'f'.

Попробуйте вместо этого %*d:. * отбрасывает прочитанное число, и литерал : говорит ему пропустить двоеточие. Вы также можете объединить все эти отдельные чтения.

fscanf(vertFile, "%*d: %f %f %f", &x, &y, &z);
...