У меня проблемы с чтением ввода из файла в структуру массивов - PullRequest
0 голосов
/ 01 декабря 2018

вот проблема, которую я имею.в основном структура определена правильно, но компилятор выдает ошибку, когда пытается прочитать ввод из данного файла.Я могу пройти через меню в цикле while перед делом, а затем выполнить опцию «a» или «A» и получить номер пациента.Затем я могу открыть файл, но не могу прочитать какую-либо информацию из файла в структурные переменные.это просто завершает код.Файлы, из которых я пытаюсь прочитать, отформатированы следующим образом: время BP_diastolic BP_systolic 01 80 120 02 81 124 03 78 118 и т. Д.

время temp 01 98,7 02 99,0 03 98,5 и т. Д.

коэффициент времени 01 68 02 70 03 65 и т. д.

Я должен прочитать информацию из файлов, поместить их в переменные и затем определить показатель здоровья для данного дня в соответствии с этим уравнением: ? (????,????, ?????, ????) = 15 ∗ ???? + 35 ∗ ????? + 25 ∗ ???? +25

где:  температура основана на температуре тела в момент времени t и определяется как: ???? = {1 ??97? ≤ ?? ≤ 99 0 ??ℎ??????
 давление зависит от артериального давления в момент времени t и определяется как: ????? = {1 ?? ??? ≤ 80 ??? ??? ≤ 120 0,5 ?? 80 <??? ≤ 89 ?? 120 <???≤ 139 0 ?? ??? ≥90 140 140 ≥ 140 <br> частота основана на частоте сердечных сокращений, заканчивающейся в момент времени t на основе некоторого ∆t, обычно от 15 до 60 секунд, и определяется как: ???? = {1 ?? 60 ≤ ?? ≤ 100 0 ??ℎ??????

Я еще не дошел до этого раздела, так как не могу понять, как получить информацию о переменных.Поэтому я не могу делать какие-либо расчеты с указанными данными.

Если выбран вариант d), программа должна запросить у пользователя момент времени для расчета показателя здоровья.После ввода правильного времени (т.е. должно быть в пределах заданного временного интервала) программа должна отобразить: a.таблица со значениями для BT, BP и HR, b.отчет об обнаружении любых состояний (например, нормальное / предгипертензия / гипертония), описанных выше, и c.значение HealthScore, полученное с использованием уравнения1.

Если выбран вариант e), должна отображаться таблица со статистическими параметрами (за интервал времени) для каждой переменной.Это включает Min, Max, Avg и Standard Dev.

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

Надеюсь, это лучшее объяснение проблем, с которыми я сталкиваюсь.Кроме того, в этот момент задание задерживается, но я все еще хотел бы понять, что я делаю неправильно.Любая помощь приветствуется.

    #include<stdio.h>
    #include<stdlib.h>


    struct bloodPressure{
       int time;
       double pressD;
       double pressS;
    };

    struct temp{
       int time;
       double temp;
    };

    struct rate{
       int time;
       double r;
    };

    struct bloodPressure BP[55];
    struct temp T[55];
    struct rate R[55];
    int main()
      {
            int timeStart,
                timeEnd,
                timeSelect;
          double minTemp,
                 maxTemp,
                 avgTemp,
                 stdTemp,
                 minPressD,
                 maxPressD,
                 avgPressD,
                 stdPressD,
                 minpressS,
                 maxPressS,
                 avgPressS,
                 stdPressS,
                 minRate,
                 maxRate,
                 avgRate,
                 stdRate,
                 score;
          char fileName[140],
               fileNameBuffer[150],
               patientNum[5],
               menuSelect = "a";
          FILE *fp;



          while (menuSelect)
          {
             printf("Please select from the following list:\n");
             printf("a/A: Enter patient number\n");
             printf("b/B: Enter file folder location\n");
             printf("c/C: Enter time interval\n");
             printf("d/D: Get health score\n");
             printf("e/E: Get statistical data\n");
             printf("f/F: Exit the program\n");
             scanf("%c", &menuSelect);

             switch(menuSelect)
             {
                // code to enter patient ID number
                case 'a':
                case 'A':
                {
                   // ask user for the patient's ID number
                   printf("Please enter the Patient's ID number:\n");
                   scanf("%s", &patientNum);

                   printf("%s", patientNum);

                   // break out of switch statement and return to main                 
                   // menu
                   break;
                }

                // code to enter file location
                case 'b':
                case 'B':
                {
                   printf("Please enter the file location:\n");
                   scanf("%s", &fileName);

                   // if file for blood pressure does not open, display 
                   // error and return to main menu
                   sprintf(fileNameBuffer, "%sBP_%s.txt", fileName, 
                   patientNum);
                   fp = fopen(fileNameBuffer, "r");
                   printf("%s \n", fileNameBuffer);
                   if (fp == NULL)
                   {
                      printf("cannot open file");
                   }

                   // if file opens, read information from the file
                   // else
                   {
                      printf("file is being read\n");
                      // read in variables from blood pressure file into 
                      // blood pressure structure
                      while (!feof (fp))//int i = 0; i < 55; i++)
                      {
                         int i = 0;
                         fscanf(fp, '%d %lf %lf', BP[i].time, 
                         BP[i].pressD, BP[i].pressS);
                         printf("%d", BP[i].time);
                         if (++i >= 55)
                         {
                            break;
                         }
                      }

                      // close the blood pressure file
                      fclose(fp);
                   }

                   // if file for blood temperature does not open, display 
                   // error and return to main menu
                   if (fp = fopen(("%sBT_%d.txt", fileName, patientNum), 
                   'r') == NULL)
                   {
                      printf("cannot open file");
                   }

                   // if file opens, read information from the file
                   else
                   {
                      // read in variables from heart rate file into blood 
                      // pressure structure
                      while (!feof (fp))
                      {
                         int i = 0;
                         fscanf(fp, '%d %lf', &(T[i].time), &(T[i].temp));
                         if (++i >= 55)
                         {
                            break;
                         }
                      }

                      // close the heart rate file
                      fclose(fp);
                   }

                   // if file for heart rate does not open, display error 
                   // and return to main menu
                   if (fp = fopen(("%sHR_%d.txt", fileName, patientNum), 
                   'r') == NULL)
                   {
                      printf("cannot open file");
                   }

                   // if file opens, read information from the file
                   else
                   {
                      // read in variables from heart rate file into blood         
                      // pressure structure
                      while (!feof (fp))
                      {
                         int i = 0;
                         fscanf(fp, '%d %f', &(R[i].time), &(R[i].r));
                         if (++i >= 55)
                         {
                            break;
                         }
                      }

                      // close the blood pressure file
                      fclose(fp);
                   }

                   // break out of switch statement and return to main 
                   // menu
                   break;
                }

                // code to enter time interval
                case 'c':
                case 'C':
                {
                   // ask user for start and end times for the time 
                   // interval
                   printf("Please enter the starting time:\n");
                   scanf('%d', timeStart);
                   printf("Please enter the ending time:\n");
                   scanf('%d', timeEnd);

                   // break out of switch statement and return to main 
                   // menu
                   break;
                }

                // code to calculate health score
                case 'd':
                case 'D':
                {

                   break;
                }

                // code to calculate statistical data
                case 'e':
                case 'E':
                {

                   break;
                }

                // code to exit the program
                case 'f':
                case 'F':
                {
                   printf("You have chosen to exit the program\n");
                   exit(1);
                }

                default:
                {
                   printf("Error: Please enter a valid menu option (a-f or 
                   A-F)");
                   break;
                }
             }
          }



        return 0;
      }

1 Ответ

0 голосов
/ 01 декабря 2018

Отредактировано после изменения вопроса - см. Ниже


Некоторые вещи в вашем коде не будут приняты компиляторами - вот некоторые улучшения, которые вы можете сделать:

  1. Строки нуждаются в двойных кавычках в C, поэтому " вместо '
  2. Переменные должны быть объявлены перед использованием.Например, в вашем коде fp и fileName не были объявлены, а BP был объявлен как псевдоним типа (с typedef) вместо переменной.
  3. Было нескольконезначительные ошибки, такие как комментирование оператора else и не завершение части if этого условия скобкой }.
  4. fopen() не принимает конструкцию для имени файла, которое вы ему дали - высначала я должен сделать это в отдельном вызове функции sprintf().
  5. Мой компилятор не слишком обрадовался конструкции if (fp = fopen(...) == NULL), хотя, возможно, другие компиляторы могут принять это.Оператор можно разделить.
  6. В операторе fscanf() было три вещи:
    • Индексы [i] были в неправильных местах,
    • iне был определен и не был увеличен до следующего значения, и не было проверки его достижения максимального значения
    • Незначительная точка: для чтения значений типа double используйте строку сканирования %lf (long float).

C - довольно сложный язык при запуске, так что не волнуйтесь ... Вот что я сделализ этого (который работал правильно на моем компьютере):

#include <stdio.h>

// structure definitions
struct bloodPressure{
    int time[55];
    double pressD[55];
    double pressS[55];
};

// declarations
struct bloodPressure BP;
char fileName[100], fullname[110];
int i = 0;
const int patientNum = 1;
FILE *fp;

// start of problem
int main() {
    printf("Please enter the file location:\n");
    scanf("%s", fileName);
    sprintf(fullname, "%sBP_%d.txt", fileName, patientNum);

    // if file for blood pressure does not open, display error and 
    // return to main menu
    fp = fopen(fullname, "r");
    if (fp == NULL)
    {
        printf("cannot open file");
    }

    // if file opens, read information from the file
    else
    {
        // read in variables from blood pressure file into blood 
        // pressure structure
        while (!feof (fp))    //int i = 0; i < 55; i++
        {
            fscanf(fp, "%d %lf %lf", &(BP.time[i]), &(BP.pressD[i]), &(BP.pressS[i]));
            if (++i >= 55) break;
        }
        // close the blood pressure file
        fclose(fp);
    }
}

Вы могли бы рассмотреть изменение определения struct bloodPressure, чтобы оно содержало данные давления одно измерение, а затем создать массивтаких структур, как

struct bloodPressure BP[55];

вместо того, что у вас есть, структура, содержащая массивы.Мне это кажется более логичным.


РЕДАКТИРОВАТЬ

Поскольку вы переписали свой вопрос и свою программу (и, я думаю, значительно улучшили ее), я редактирую ответ.

Я могу открыть файл, но не могу прочитать какую-либо информацию из файла в структурные переменные.он просто завершает код.

В строке 109 ваш шаблон сканирования fscan по-прежнему заключен в одинарные кавычки (кавычки должны быть ").То же самое в некоторых других местах, например в строке 188.

Кстати, ваш оператор else в строке 101 все еще закомментирован.

Как правило, ваше кодирование быстро улучшается.Это может помочь, если вы скажете своему компилятору предупредить вас, когда вы делаете что-то, что может привести к ошибкам.Многие компиляторы принимают опцию -Wall ( W arn при всех вещах, которые ему не нравятся).

...