Как сделать чтение и вычитать 2 значения в разных строках файла в C - PullRequest
0 голосов
/ 08 октября 2011

У меня есть текстовый файл типа

19.39825343760206 , -99.20035242455288
19.402068553663323, -99.18884038346096
19.412830341813137, -99.18181299584194
19.420813944440887, -99.17626082318111
19.421929492669275, -99.17060940878673
19.423626831405098, -99.16279076950832
19.42586547013487,  -99.15465428846164
19.427341437102363, -99.14900153296276
19.42677988826859,  -99.14223767237945
19.426539585246708, -99.13745395260139
19.425789584581995, -99.13291163163467
19.42548983629902,  -99.12465713339134
19.428912245829306, -99.11943755464836
19.430273095215284, -99.11480135636612
19.42715425437469,  -99.10933367328926
19.423242338939442, -99.10226739363952

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

(-99.20035242455288)  -  (-99.18884038346096)
(-99.18884038346096)  -  (-99.18181299584194)  
(-99.18181299584194)  -  (-99.17626082318111)
...
(-99.10933367328926)  -  (-99.10226739363952)
??

Я выполнял функцию, подобную следующей, но не знаю, как сохранить первое значение, а затем значение во второй строке .... Также как сказать C, что я хочу второе значение (разделенноезапятая)

void read_second_value (const char* file_name)
{
  FILE* file = fopen (file_name, "r");
  double i        = 0;
  double i_plus_1 = 0;
  fscanf (file, "%f", &i);    

  while (!feof (file))
  {  
      printf ("%f ", i);
      fscanf (file, "%f", &i);      
    }
  fclose (file);        
}

но я пробовал решение типа:

#include <stdio.h>
#include <stdlib.h>
int main()
{
  char* file_name = "C:\\test.txt";
  FILE* fp = NULL;
  double left_value, right_value = 0.0, prev_value = 0.0;

  if ((fp = fopen (file_name, "r")) == NULL) {
    printf ("FILE OPEN ERROR: %d\n", errno);
    exit (1);
  }
  if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2)
    printf ("WARNING: failed to read two values...\n");
  else
    printf ("left_value: %lf, right_value: %lf ", left_value, right_value);
  while (!feof (fp))
  {
      prev_value = right_value;
      if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2)
        printf ("WARNING: failed to read two values...\n");
      else {
        printf ("left_value: %lf, right_value: %lf ", left_value, right_value);
        printf ("%lf - %lf = %lf\n", prev_value, right_value, prev_value - left_value);
      }
    }
  fclose (fp);
  return 0;
}

, но получаю бесконечное

ПРЕДУПРЕЖДЕНИЕ: не удалось прочитать два значения ...

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Этот пример кода работает ... до тех пор, пока вы исправите первую строку:

ХОРОШО: xxx.00, yyy.00 BAD: xxx.00, yyy.00

#include <stdio.h>
#include <errno.h>

int
main (int argc, char *argv[])
{
  FILE* fp = NULL;
  int ct = 0;
  double left_value, right_value = 0.0, prev_value = 0.0;

  if (argc != 2) {
    printf ("USAGE: %s <filename>\n", argv[0]);
    return 1;
  }

  if ((fp = fopen (argv[1], "r")) == NULL) {
    printf ("FILE OPEN ERROR: %d\n", errno);
    return 1;
  }

  ct = fscanf (fp, "%lf, %lf", &left_value, &right_value);
  if (ct != 2) {
    printf ("WARNING: failed to read two values...\n");
    return 1;
  }

  while (!feof (fp)) {
      prev_value = right_value;
      ct = fscanf (fp, "%lf, %lf", &left_value, &right_value);
      if (ct == 0) {
        printf ("End of file...\n");
      }
      else if (ct != 2) {
        printf ("WARNING: failed to read two values...\n");
      }
      else {
        printf ("left_value: %lf, right_value: %lf ",
          left_value, right_value);
        printf ("%lf - %lf = %lf\n",
          prev_value, right_value, prev_value - left_value);
      }
  }
  printf ("Closing file...\n");
  fclose (fp);
  return 0;
}

В первой строке после первого числа стоит пробел.все остальные строки имеют «запятую».

Если вы хотите использовать «scanf», вы ДОЛЖНЫ иметь согласованный набор данных.

Если вы хотите более надежный анализ,тогда вы должны:

1) "fgets ()" в каждой строке

2) использовать такие функции, как "strchr ()" (предпочтительно) или "strok ()" (не рекомендуется) для анализаотдельные токены (3 токена в строке: 1-й номер, запятая и 2-й номер).

1 голос
/ 08 октября 2011

Как насчет этого:

void read_values (const char* file_name)
{
  FILE* fp = NULL;
  double left_value, right_value = 0.0, prev_value = 0.0;

  if ((fp = fopen (file_name, "r")) == NULL) {
    printf ("FILE OPEN ERROR: %d\n", errno);
    exit (1);
  }
  if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2)
    printf ("WARNING: failed to read two values...\n");
  else
    printf ("left_value: %lf, right_value: %lf ", left_value, right_value);
  while (!feof (fp))
  {  
      prev_value = right_value;
      if (fscanf (fp, "%lf, %lf", &left_value, &right_value) != 2)
        printf ("WARNING: failed to read two values...\n");
      else {
        printf ("left_value: %lf, right_value: %lf ", left_value, right_value);
        printf ("%lf - %lf = %lf\n", prev_value, right_value, prev_value - left_value);
      }
    }
  fclose (fp);        
}

PS: Я не скомпилировал или протестировал ... но я надеюсь, что это будет полезно для вас ...

...