Выполнить fgetc() c использованием цикла while

У меня большая проблема с использованием fgetc(), и я не могу понять это... Я пытаюсь разобрать текстовый файл, все компилируется, но при выполнении я получил бесконечный цикл или segfault (Code::blocks), мой текстовый файл выглядит так: {"USD_EUR": "0.8631364", "EUR_USD": "1.3964719"} с 16 изменениями курса. Я стараюсь поставить все мои поплавки в курс [16]...

FILE* file = NULL;
file = fopen(myFile, "r+");
int value,i;
float rate[16];
char* str = "";
if (file != NULL)
{
    do
    {
        value = fgetc(file);
        printf("%c \n",value);
        while(value > 48 && value < 57)
        {
            value = fgetc(file);
            strcat(str, value);
            //printf("%s \n", str);
        }
        rate[i] = atof(str);
        i++;
        str = "";
    }while(value != 125); // 125 = }

5 ответов

Решение

while(value =! EOF); должно быть while(value != EOF);

Это большая разница. Первый случай - это присвоение значения переменной, второй случай - если значение не равно EOF.

EOF является макросом и обычно имеет значение -1, это означает, что !EOF становится 0. Так как у вас есть do{} while() он будет запущен один раз, но не более, поскольку условие ложно.

while(value =! EOF) не то же самое, что while(value != EOF)

Что вам нужно, так это последний while(value != EOF)

В цикле while вы присваиваете значение переменной.

     `while(value =! EOF);`

Значение EOF равно -1.(Т.е.) Конец файла. если это!-1, то он будет принимать значение 0. Поскольку это do, то только после того, как цикл будет выполнен, в следующий раз условие будет ложным. Таким образом, он получает только один персонаж. Ты можешь использовать

`while(value != EOF);`

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

Декларация стоимости неверна, и сделайте это правильно.

int value;

В то время как ( value != EOF ) сравнивает значение с EOF. Здесь EOF - это макрос, имеющий значение -1. Сравнивая ценность с этим. Вы можете увидеть это, используя cc -E во время компиляции.

(value =!EOF) Значит это value =! (-1) Так !(-1) приходит ноль. Это назначит значение переменной. Таким образом, в условии ноль ложно. Так и вышло из цикла. И вы можете проверить значение переменной, напечатав эту переменную.

The following code does the job of reading/echoing a input file
char by char.

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

char *theFile = "input.txt";

int main()
{
    FILE* file = NULL;
    int value;

    if( NULL == ( file = fopen(theFile, "r") ) )
    { // then fopen failed
        perror( "fopen failed" );
        exit(EXIT_FAILURE );
    }

    // implied else, fopen successful

    while( EOF != (value = fgetc(file) ) )
    {
        printf("%c \n",value);
    } // end while

    return(0);
} // end function: main
Другие вопросы по тегам