[英]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.