Как напрямую ввести целочисленные значения из строки (читать из файла) с помощью sscanf? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь написать кусок кода, который будет читать «заголовок» файла PPM.Например:

P3
400 200
255

В этом случае ширина равна 400, а высота равна 200, а максимальное значение цвета равно 255. Я пытаюсьприсваивать этим строковым значениям целые числа, но я думаю, что есть лучший способ сделать это с меньшим количеством строк и более «более безопасным».Как я могу избежать использования функции atoi ()?(Обратите внимание, что я уже включил «проверить, является ли файл доступной для открытия частью в моем АКТУАЛЬНОМ коде, это всего лишь уменьшенный фрагмент)

  char buffer[200];
  char height[200];
  char width[200];
  char maxColour[200];

  FILE *file = fopen("mcmaster.ppm", "r");

  fgets(buffer, sizeof(buffer), file); // File format line

  fgets(buffer, sizeof(buffer), file); // Width x height line
  sscanf(buffer, "%s %s", width, height);

  fgets(buffer, sizeof(buffer), file); // Max colour line
  sscanf(buffer, "%s", maxColour);

  int actHeight = atoi(height);
  int actWidth = atoi(width);
  int actMaxColour = atoi(maxColour);

1 Ответ

0 голосов
/ 22 ноября 2018

Я предлагаю вам использовать fscanf вместо sscanf.Сначала определите «функцию ошибки» для проверки проблем чтения файла, как

void fscanf_Error(char *file)
{
    fprintf(stderr,"Error reading file: %s\n. Exiting(1).\n ",file);
    exit(1);
}

Затем

  char dummy[12];
  if(!fscanf(file, "%s\n", dummy))
      fscanf_Error(file);
  if(!fscanf(file," %d %d\n", width, height))
      fscanf_Error(file);
  if(!fscanf(file, "%d\n", maxColour))
      fscanf_Error(file);
...