Чтение значений из файла - некоторые верны, другие неверны - PullRequest
0 голосов
/ 14 февраля 2011

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

2  //number of items per variable
0 0 0  //values for center locations (stored as struct)
0 0 .5
10  //values for some variable v1 (type double)
5
-10  //values for some variable v2 (type double)
10

Это код, который я имею для чтения в этих значениях:

 ...
 fscanf(file, "%d\n", &nItems);
 for (unsigned int i = 0; i < nItems; i++)
 {
  float cx, cy, cz;
  fscanf(file, "%f %f %f\n", &cx, &cy, &cz);

  center[i].cx = cx;
  center[i].cy = cy;
  center[i].cz = cz;
 }
 for (unsigned int i = 0; i < nItems; i++)
 {    
  fscanf(file, "%f\n", &v1[i]);   
 }  
 for (unsigned int i = 0; i < nItems; i++)
 {
  fscanf(file, "%f\n", &v2[i]);   
 }

Проблема, с которой я сталкиваюсь, заключается в том, что когда я читаю значения таким образом и выводю их, значения для nItems и расположения центра являются правильными, а остальные - неправильными. Однако знаки и относительная величина этих значений верны. Например, для списка значений, показанного выше, это выходные значения:

Correct              Outputted values
2                    2  
0 0 0                0.000000 0.000000 0.000000  
0 0 .5               0.000000 0.000000 0.500000
10                   524288.000000  
5                    2048.000000
-10                  -524288.000000  
10                   524288.000000

Я не знаю, почему значения последних двух переменных читаются неправильно. Буду признателен за ваш совет.

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2011

Я не уверен, что это так, но из вашего примера выглядело, что вторые две группы данных являются целыми числами, а не значениями с плавающей точкой. Тем не менее, в вашем коде вы пишете

for (unsigned int i = 0; i < nItems; i++)
{    
    fscanf(file, "%f\n", &v1[i]);   
} 

То есть вы читаете их, используя спецификатор %f, который предназначен для чисел с плавающей запятой. Если массивы v1 и v2 являются массивами int s, это не будет работать правильно; он заменит целые числа с помощью битовых комбинаций, которые должны интерпретироваться как числа с плавающей запятой.

Чтобы исправить это, попробуйте написать вместо этого:

for (unsigned int i = 0; i < nItems; i++)
{    
    fscanf(file, "%d\n", &v1[i]);   
} 

То есть используйте спецификатор %d.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...