Чтение текстового файла .txt в C, содержащего float, разделенных пробелом - PullRequest
9 голосов
/ 22 августа 2011

это выглядит обычным и очевидным, но я уже читал TXT-файл в C в прошлом, и здесь я действительно застрял.

У меня есть TXT-файл этого формата

0.00000587898458 0.0014451541000 0.000000000001245
0.00012454712235 0.1245465756945 0.012454712115140

... с 640 столбцами и 480 строками.

Я хочу поместить каждый номер моего txt-файла в число с плавающей точкой с максимально возможной точностью и в цикл for.

FILE* myfile=NULL;
double myvariable=0.0;
myfile=fopen("myfile.txt","r");

for(i =0, k=0 ; i< height; i++)
    for (j=0 ; j< width ; j++){
fscanf(myfile,"%0.20f",&myvariable);
printf("%0.20f",myvariable);
k++;
}
}
fclose(myfile);

Большое спасибо за помощь

Ответы [ 4 ]

8 голосов
/ 22 августа 2011

В вашей программе есть несколько ошибок - несоответствующие фигурные скобки, неопределенные переменные и т. Д. Однако наиболее важная и наиболее вероятная причина вашей проблемы заключается в том, что вы не передаете указатель на myvariable в Ваш fscanf() звонок. Вы можете использовать &myvariable там, чтобы fscanf() мог заполнить его соответствующим образом. Вам, вероятно, не нужно, чтобы строка формата была настолько сложной, либо - "%lf" должен прекрасно работать для чтения double. Фактически, gcc предупреждает меня вашей строкой формата:

example.c:16: warning: zero width in scanf format
example.c:16: warning: unknown conversion type character ‘.’ in format

И тогда мой вывод становится равным 0. Попробуйте "%lf". Вот полный рабочий пример с вашим примером ввода:

#include <stdio.h>

#define HEIGHT 2
#define WIDTH  3

int main(void)
{
  FILE *myfile;
  double myvariable;
  int i;
  int j;

  myfile=fopen("myfile.txt", "r");

  for(i = 0; i < HEIGHT; i++)
  {
    for (j = 0 ; j < WIDTH; j++)
    {
      fscanf(myfile,"%lf",&myvariable);
      printf("%.15f ",myvariable);
    }
    printf("\n");
  }

  fclose(myfile);
}

Пример выполнения:

$ ./example 
0.000005878984580 0.001445154100000 0.000000000001245 
0.000124547122350 0.124546575694500 0.012454712115140 
3 голосов
/ 22 августа 2011
 fscanf(myfile,"%0.20f",myvariable);

Вы должны передать указатель, вместо этого используйте & myvariable.Исправить:

 fscanf(myfile, "%lf", &myvariable);
2 голосов
/ 22 августа 2011

Я могу только догадываться, так как вы не показали нам свой настоящий исходный код, но ...

fscanf формат "%f" ожидает указатель на float; вы даете ему указатель на double. Это, вероятно, то, что вызывает проблему, которую вы видите. Используйте "%lf" для double (или "%Lf" для long double).

Да, это несоответствие между функциями *printf и *scanf. Он существует потому, что float аргументы *printf повышены до double; для указателей такого продвижения нет, например, аргументы float*, которые вы можете передать fscanf.

И просто используйте "%lf", а не "%0.20lf"; Я не уверен, что последнее действительно даже.

0 голосов
/ 22 августа 2011
  1. Вы говорите, что застряли, но не вдавались в подробности относительно того, с чем именно вы столкнулись.
  2. Скорее всего, вы намеревались передать адрес 'myvariable' в fscanf.
  3. Даже если вас не очень заботит точность (и в вашем случае вы четко говорите, что делаете), вы должны предпочесть удвоение над плавающим. Вы должны выбирать float только тогда, когда у вас есть очень веская причина, чтобы предпочесть float, а не double, и даже это должно быть в очень специфических ситуациях.
  4. Всегда проверяйте вызовы fopen, чтобы убедиться в их успешности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...