簡體   English   中英

有沒有更安全的 EOF 替代品? 它在我的情況下不起作用

[英]Is there a safer alternative for EOF? It's not working in my case

我正在處理我的學校項目,我必須在其中處理 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;
}

有人可以幫我嗎??

EOF是一個(宏)負整數。 fgetc讀取轉換為 int 的無符號字符。 只要 unsigned char 的范圍小於 int 的范圍,這種轉換永遠不會導致負數,在這種情況下,與EOF沒有重疊。 我不知道 sizeof(int) == 1 的奇異系統如何處理這個問題。

但是在您的嘗試中,您將賦值操作的結果(左值)與左操作數(從 int 轉換為字符)進行比較。 因此,您的擔憂是有道理的。

要修復程序,請將輸入讀入 int 變量,將其與EOF進行比較,然后轉換為 char。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM