EOF是否有更安全的选择?在我的情况下不起作用

问题描述 投票:0回答:1

我正在我的学校项目中工作,在该项目中我必须使用c / c ++处理文件。我担心使用while((c=fgetc())!=EOF),因为:

如果文件的二进制代码包含与EOF值相同的11111111,并且程序意外完成,该怎么办?

这里是一个示例代码,在该示例代码中,我首先创建一个包含-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;
}

有人可以帮我吗?

c++ binaryfiles file-handling eof
1个回答
2
投票

EOF是(为a的宏)负整数。 fgetc读取转换为int的无符号字符。只要无符号字符的范围小于int的范围,这种转换就不会导致负数,在这种情况下,与EOF不会重叠。 我不知道sizeof(int)== 1的外来系统如何处理此问题。

但是,尝试将赋值操作的结果(左值)与左操作数(从int转换为char)进行比较。因此,您的担心是有效的。

要修复程序,请将输入读取为int变量,将其与EOF进行比较,然后then转换为char。

© www.soinside.com 2019 - 2024. All rights reserved.