C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析
std::ifstream::readsome和std::ifstream::read的主要區(qū)別在于它們處理輸入流的方式和可能返回的結果。
- 處理方式:
-
std::ifstream::readsome
是一個非阻塞的讀取函數(shù),它嘗試從輸入流中讀取一些數(shù)據(jù),即使到達文件末尾(EOF)也不會立即停止,而是返回已經(jīng)讀取的字節(jié)數(shù)。這意味著,如果在讀取過程中遇到EOF,readsome
會返回已經(jīng)讀取的數(shù)據(jù),而不是等待直到有更多數(shù)據(jù)可用或直到達到請求的數(shù)量。std::ifstream::read
是一個阻塞的讀取函數(shù),它會嘗試讀取指定數(shù)量的字節(jié),如果數(shù)據(jù)不可用,它會等待直到達到請求的數(shù)量或者遇到EOF。在達到EOF時,read
會設置EOF標志并返回0,表示沒有更多數(shù)據(jù)可以讀取。
-
返回值:
std::ifstream::readsome
返回實際讀取的字符數(shù),或者在發(fā)生錯誤時返回一個特殊的值(如流錯誤狀態(tài))。這個函數(shù)不會因為到達EOF而立即停止,因此可能會返回一個比請求的數(shù)量少的值。std::ifstream::read
返回實際讀取的字符數(shù),或者在發(fā)生錯誤時設置錯誤狀態(tài)并返回一個特殊的值。當?shù)竭_文件末尾時,它會返回0,表示沒有更多數(shù)據(jù)可以讀取。
-
應用場景:
- 當您不確定輸入流中是否有足夠的數(shù)據(jù)時,或者當您希望程序在等待數(shù)據(jù)的同時繼續(xù)執(zhí)行其他任務時,
std::ifstream::readsome
是一個合適的選擇。它允許程序在數(shù)據(jù)可用時繼續(xù)處理,而不是完全阻塞等待所有數(shù)據(jù)都準備好。 - 當您需要確保讀取特定數(shù)量的數(shù)據(jù),或者當您確信輸入流中有足夠的數(shù)據(jù)時,
std::ifstream::read
是更合適的選擇。它提供了更明確的控制,確保程序在數(shù)據(jù)不足時不繼續(xù)執(zhí)行。
- 當您不確定輸入流中是否有足夠的數(shù)據(jù)時,或者當您希望程序在等待數(shù)據(jù)的同時繼續(xù)執(zhí)行其他任務時,
總的來說,選擇使用std::ifstream::readsome
還是std::ifstream::read
取決于您的具體需求:如果您希望程序在數(shù)據(jù)可用時立即處理,并且不介意可能讀取到的數(shù)據(jù)量少于請求的量,那么std::ifstream::readsome
是合適的選擇;如果您需要確保讀取到確切數(shù)量的數(shù)據(jù),或者當數(shù)據(jù)不足時不進行任何操作,那么應該使用std::ifstream::read
1。
std::ifstream::readsome和std::ifstream::read的主要區(qū)別在于它們處理輸入流的方式和可能返回的結果。
-
處理方式:
std::ifstream::readsome
是一個非阻塞的讀取函數(shù),它嘗試從輸入流中讀取一些數(shù)據(jù),即使到達文件末尾(EOF)也不會立即停止,而是返回已經(jīng)讀取的字節(jié)數(shù)。這意味著,如果在讀取過程中遇到EOF,readsome
會返回已經(jīng)讀取的數(shù)據(jù),而不是等待直到有更多數(shù)據(jù)可用或直到達到請求的數(shù)量。std::ifstream::read
是一個阻塞的讀取函數(shù),它會嘗試讀取指定數(shù)量的字節(jié),如果數(shù)據(jù)不可用,它會等待直到達到請求的數(shù)量或者遇到EOF。在達到EOF時,read
會設置EOF標志并返回0,表示沒有更多數(shù)據(jù)可以讀取。
-
返回值:
std::ifstream::readsome
返回實際讀取的字符數(shù),或者在發(fā)生錯誤時返回一個特殊的值(如流錯誤狀態(tài))。這個函數(shù)不會因為到達EOF而立即停止,因此可能會返回一個比請求的數(shù)量少的值。std::ifstream::read
返回實際讀取的字符數(shù),或者在發(fā)生錯誤時設置錯誤狀態(tài)并返回一個特殊的值。當?shù)竭_文件末尾時,它會返回0,表示沒有更多數(shù)據(jù)可以讀取。
-
應用場景:
- 當您不確定輸入流中是否有足夠的數(shù)據(jù)時,或者當您希望程序在等待數(shù)據(jù)的同時繼續(xù)執(zhí)行其他任務時,
std::ifstream::readsome
是一個合適的選擇。它允許程序在數(shù)據(jù)可用時繼續(xù)處理,而不是完全阻塞等待所有數(shù)據(jù)都準備好。 - 當您需要確保讀取特定數(shù)量的數(shù)據(jù),或者當您確信輸入流中有足夠的數(shù)據(jù)時,
std::ifstream::read
是更合適的選擇。它提供了更明確的控制,確保程序在數(shù)據(jù)不足時不繼續(xù)執(zhí)行。
- 當您不確定輸入流中是否有足夠的數(shù)據(jù)時,或者當您希望程序在等待數(shù)據(jù)的同時繼續(xù)執(zhí)行其他任務時,
總的來說,選擇使用std::ifstream::readsome
還是std::ifstream::read
取決于您的具體需求:如果您希望程序在數(shù)據(jù)可用時立即處理,并且不介意可能讀取到的數(shù)據(jù)量少于請求的量,那么std::ifstream::readsome
是合適的選擇;如果您需要確保讀取到確切數(shù)量的數(shù)據(jù),或者當數(shù)據(jù)不足時不進行任何操作,那么應該使用std::ifstream::read
下面示例介紹C++中std::ifstream::readsome和std::ifstream::read的區(qū)別。
std::ifstream::readsome的原型如下,可以返回實際讀到的字節(jié)數(shù)量,但是不會把eofbit置1,所以不能直接調用eof判斷是否到文件尾
streamsize readsome (char* s, streamsize n);
std::ifstream::read原型如下,會置eof, 但沒法直接得到實際讀取字節(jié)數(shù)
istream& read (char* s, streamsize n);
如果既需要能獲得讀取字節(jié)數(shù),又需要能判斷是否讀到文件尾,可有如下兩種方法:
1. 使用std::ifstream::readsome
#include <iostream> #include <fstream> #include <sstream> using namespace std; streamsize Read(istream &stream, char *buffer, streamsize count) { // This consistently fails on gcc (linux) 4.8.1 with failbit set on read // failure. This apparently never fails on VS2010 and VS2013 (Windows 7) streamsize reads = stream.rdbuf()->sgetn(buffer, count); // This rarely sets failbit on VS2010 and VS2013 (Windows 7) on read // failure of the previous sgetn() stream.rdstate(); // On gcc (linux) 4.8.1 and VS2010/VS2013 (Windows 7) this consistently // sets eofbit when stream is EOF for the conseguences of sgetn(). It // should also throw if exceptions are set, or return on the contrary, // and previous rdstate() restored a failbit on Windows. On Windows most // of the times it sets eofbit even on real read failure stream.peek(); return reads; } int main(int argc, char *argv[]) { ifstream instream("filepath", ios_base::in | ios_base::binary); while (!instream.eof()) { char buffer[0x4000]; size_t read = Read(instream, buffer, sizeof(buffer)); // Do something with buffer } }
2. 使用std::ifstream::read后,使用gcount()獲得上一次讀取的字節(jié)數(shù)
ifstream ifs("a.txt"); char buf[1024]; ifs.read(buf, 1024); size_t extracted = ifs.gcount(); // or ifstream ifs("a.txt"); char buf[1024]; size_t extracted = ifs.read(buf, 1024).gcount();
Ref:
https://stackoverflow.com/questions/9191876/when-does-ifstreamreadsome-set-eofbit
https://stackoverflow.com/questions/11720880/ifstreamread-doesnt-tell-how-many-bytes-it-really-reads
到此這篇關于std::ifstream::readsome和std::ifstream::read的區(qū)別的文章就介紹到這了,更多相關std::ifstream::readsome和std::ifstream::read區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- C++中std::setw()的用法解讀
- c++中std::placeholders的使用方法
- c++ std::sort使用自定義的比較函數(shù)排序方式
- C++中std::thread{}和std::thread()用法
- C++中std::tuple和std::pair的高級用法
- c++之std::get_time和std::put_time
- C++中std::ios_base::floatfield報錯已解決
- C++中std::invalid_argument報錯解決
- C++中的std::funture和std::promise實例詳解
- C++中std::transform的使用小結
- C++?std::copy與memcpy區(qū)別小結
- C++實現(xiàn)std::set的示例項目
相關文章
基于Matlab實現(xiàn)野狗優(yōu)化算法的示例代碼
野狗優(yōu)化算法(Dingo?Optimization?Algorithm,?DOA)模仿澳大利亞野狗的社交行為。DOA算法的靈感來源于野狗的狩獵策略,即迫害攻擊、分組策略和食腐行為。本文將通過Matlab實現(xiàn)這一算法,感興趣的可以了解一下2022-04-04