簡體   English   中英

eof位:讀取失敗之前或之后?

[英]eof bit : before or after a read failure?

我目前為一些IO操作編寫一個類。 某些函數返回IO操作是否成功。 如果正在讀取文件,我想知道是否應該返回std::ifstream::good()!std::ifstream::fail()來指示IO操作是否成功。

區別來自eof位,我不確定我是否正確理解它。

假設我有一個二進制文件,其中有4個字節(1個整數)。

假設我讀了這個整數。

我的問題是:將在此操作之后還是在下一個IO操作(會失敗)之后設置eof標志?

如果在此操作之后直接將其設置,如果我的閱讀函數返回std::ifstream::good() ,則結果將為false (但已正確讀取整數)。

您能解釋一下當eof位置1時,我應該在函數末尾返回什么嗎?

嘗試讀取過流結束的EOF標志設置。

您的函數應返回對原始流的引用,並且應在循環或有條件的條件下使用它,如下所示:

std::istream & process(std::istream & is)
{
    int n;
    if (is >> n) { std::cout << "Read one int: " << n << "\n"; }
    return is;
}

int main()
{
    std::ifstread infile("data.bin");

    while (process(infile)) { }
}

當讀取操作嘗試讀取超出流末尾的內容時,將設置流的“ eof”位。 讀取超出流末尾的讀取操作可能成功也可能不會成功。 這與是否設置了“ eof”位無關。

因此,您應該始終檢查讀取操作本身的結果,而不要在讀取后檢查流標志的狀態。

對於所有四個組合的示例:

#include <iostream>
#include <istream>

int main()
{
        int n;
        if (std::cin >> n)
                std::cout << "read an int with value = " << n << '\n';
        else
                std::cout << "read of int failed\n";

        std::cout << "cin.eof() = " << std::cin.eof() << '\n';
        return 0;
}

成功讀取將eof位置1:

$ printf 1 | ./a.out
read an int with value = 1
cin.eof() = 1

成功讀取未設置eof位:

$ echo 1 | ./a.out
read an int with value = 1
cin.eof() = 0

讀取失敗,未設置eof位:

$ printf abc | ./a.out
read of int failed
cin.eof() = 0

讀取失敗,將eof位置1:

$ echo | ./a.out
read of int failed
cin.eof() = 1

eof標志在“下一個IO操作(將失敗)之后”設置。 您應該在讀取操作之后返回std::ifstream::good() ,該操作將告訴您是否設置了任何錯誤標志。

暫無
暫無

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

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