читая входные данные из входного файла, продолжайте получать бесконечный цикл - PullRequest
0 голосов
/ 26 ноября 2018

после неустанного поиска объяснения, я решил спросить великих людей в stackoverflow.Поэтому в настоящее время я пытаюсь читать каждую строку ввода построчно из файла с именем data.txtПрограмма прекрасно работает с использованием простого scanf и тому подобного, но когда я хочу прочитать входные значения из файла, программа читает только первые 3 строки текста и продолжает повторяться в бесконечном цикле.Мой код показан ниже.Я сохранил большую часть своего кода на случай, если у других возникнет искушение его использовать.Программа будет просто читать 1, 12, 0 бесконечно.Пример файла data.txt показан ниже

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

// Global variables
char *Hstring = NULL;
int maxLength, parity;
char *temp = NULL;
int userChoice = 0;


void option1() {
    // User inputs length and even or odd parity bit 
    printf("\n*** Maximum Code Length: %d", maxLength);
    //scanf("%d",&maxLength);
    printf("\n*** Parity: %d", parity);
    //scanf("%d",&parity);
   // allocate memory for hamming string based on maximum length and 
   //size of character element
    Hstring = (char *)malloc(maxLength * sizeof(char));
    return;
}

void option2() {
    /* declare local vars */
    int aLength, k, parBits, parValue, errorPos, i, j;
    /* prompt for hamming code as a "string"*/
    printf("\nEnter the Hamming Code: ");
    scanf("%s", Hstring);
    temp = Hstring;
    aLength = strlen(Hstring);
    parBits = ceil(log(aLength) / log(2));
}

int main() {
    FILE *fp;
    fp = fopen("data.txt", "r");
    if (fp == NULL) {
        printf("ERROR OPENING THE FILE\n");
    }
    fscanf(fp, "%d %d %d", &userChoice, &maxLength, &parity);
    //end file open

    while (userChoice != 3) {
        printf("\nEnter Selection: %d", userChoice);
        //scanf("%d",&userChoice);
        switch (userChoice) {
        case 1:option1();
            break;
        case 2:option2();
            break;
        case 3:
            printf("\n*** Program Terminated Normally\n");
            break;
        default: printf("invalid input please input another number\n\n");
            break;
        }
    }
    /* print out menu, prompt for choice, and call appropriate procedure
    until user quits */

    return 1;
}

SAMPLE data.txt

1
12
0
2
1000
1

Код начинает цикл, когда он читает третье целое число (четность) в option1 ()

Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

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

Ответ здесь https://stackoverflow.com/a/53475412/4386427 правильно описывает проблему, то есть, что у вас бесконечный цикл, потому что userChoice читается только один раз.

Вот предложение для исправления.

int main() {
    FILE *fp;
    fp = fopen("data.txt", "r");
    if (fp == NULL) {
        printf("ERROR OPENING THE FILE\n");
    }


    while (userChoice != 3) {

        // Check that exactly 3 items are read from the file.
        // If not terminate the program
        if (fscanf(fp, "%d %d %d", &userChoice, &maxLength, &parity) != 3) {
            printf("Illegal input from file or EOF. Terminating program\n");
            break;
        }

        switch (userChoice) {
        case 1:option1();
            break;
        case 2:option2();
            break;
        case 3:
            printf("\n*** Program Terminated Normally\n");
            break;
        default: printf("invalid input please input another number\n\n");
            break;
        }
    }

    return 1;
}
0 голосов
/ 26 ноября 2018

Вы никогда не измените userChoice в вашем цикле while, так что он будет работать вечно.

В любом случае, даже если вы использовали fscanf в цикле while и, следовательно, читали весь файл до тех пор, пока не нашли userChoice == 3, было бы плохой идеей иметь условие завершения цикла только в зависимости от содержимогофайл, вы также должны проверить результат fscanf для завершения файла.Данные в вашем примере будут по-прежнему зациклены навсегда, поскольку они не содержат 3.

...