Есть ли более безопасная альтернатива для EOF? Это не работает в моем случае - PullRequest
0 голосов
/ 26 января 2020

Я работаю над своим школьным проектом, в котором мне нужно обрабатывать файлы на c / c ++. Я беспокоюсь об использовании while((c=fgetc())!=EOF), потому что:

Что, если двоичный код файла содержит 11111111, который имеет то же значение, что и EOF, и программа неожиданно завершает работу?

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

int main()
{
    FILE *p;

    fopen_s(&p, "my.binn", "wb");
    char c;
    char result;

    for (int t = 0; t < 3; t++)
    { //putting some bytes in file
        result = 0;
        for (int r = 0; r < 8; r += 2)
        {
            result |= (1 << (7 - r));
        }
        putc(result, p);
    }

    result = 0;

    for (int r = 0; r < 8; r++)
    { //putting a byte of 11111111
        result |= (1 << (7 - r));
    }

    putc(result, p);

    for (int t = 0; t < 3; t++)
    { //again putting some bytes in file
        result = 0;
        for (int r = 0; r < 8; r += 2)
        {
            result |= (1 << (7 - r));
        }
        putc(result, p);
    }
    fclose(p);

    fopen_s(&p, "my.binn", "rb");

    while ((c = fgetc(p)) != EOF)
    { //here this loop was expected to continue until end of file(7 bytes) but it prints only three stars
        cout << "*";
    }
    fclose(p);
    return 0;
}

Может кто-нибудь помочь мне с этим, пожалуйста?

1 Ответ

3 голосов
/ 26 января 2020

EOF является (макросом для) отрицательного значения int. fgetc читает неподписанный символ, приведенный к int. Пока диапазон беззнаковых символов меньше, чем у int, такое преобразование никогда не приводит к отрицательному числу, и в этом случае нет совпадения с EOF. Я не знаю, как exoti c системы, где sizeof (int) == 1 могут справиться с этим.

Но в вашей попытке вы сравниваете результат назначения операция, которая lvalue для левого операнда, который является символом, преобразованным из int. Таким образом, ваша проблема действительна.

Чтобы исправить программу, прочитайте ввод в переменную int, сравните ее с EOF и , затем преобразуйте в символ.

...