欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析

 更新時間:2024年08月26日 10:17:32   作者:photon_wa  
?std::ifstream::readsome和std::ifstream::read?的主要區(qū)別在于它們處理輸入流的方式和可能返回的結果,下面給大家介紹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í)行。

總的來說,選擇使用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í)行。

總的來說,選擇使用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語言實現(xiàn)五子棋小游戲

    C語言實現(xiàn)五子棋小游戲

    五子棋游戲是一款很經(jīng)典的智力游戲,只有學過編程語言的人,把五子棋的編程原理弄懂了,就能用自己熟悉的語言實現(xiàn)出來,在這里給大家分享,c語言五子棋源碼,僅供大家參考借鑒。
    2016-03-03
  • C語言函數(shù)的參數(shù)使用指針

    C語言函數(shù)的參數(shù)使用指針

    這篇文章主要介紹了C語言函數(shù)的參數(shù)使用指針,本文講述了指針在作為函數(shù)參數(shù)時候的使用方法,解析值傳遞和值引用的區(qū)別案例,希望對你有所幫助
    2021-06-06
  • 基于Matlab實現(xiàn)野狗優(yōu)化算法的示例代碼

    基于Matlab實現(xiàn)野狗優(yōu)化算法的示例代碼

    野狗優(yōu)化算法(Dingo?Optimization?Algorithm,?DOA)模仿澳大利亞野狗的社交行為。DOA算法的靈感來源于野狗的狩獵策略,即迫害攻擊、分組策略和食腐行為。本文將通過Matlab實現(xiàn)這一算法,感興趣的可以了解一下
    2022-04-04
  • C語言實現(xiàn)數(shù)獨輔助器(附源碼)

    C語言實現(xiàn)數(shù)獨輔助器(附源碼)

    數(shù)獨是源自瑞士的一種數(shù)學游戲。是一種運用紙、筆進行演算的邏輯游戲。本文將利用C語言制作一個數(shù)獨輔助器,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-01-01
  • C++中auto關鍵字的使用

    C++中auto關鍵字的使用

    本文主要介紹了C++中auto關鍵字的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C++中正則表達式的使用方法詳解

    C++中正則表達式的使用方法詳解

    幾乎所有的編程語言都支持正則表達式。 C++從C++11開始直接支持正則表達式。除了編程語言之外,大多數(shù)文本處理程序都使用正則表達式。本文將探討正則表達式的一般細節(jié)以及C++編程方面的細節(jié),感興趣的可以學習一下
    2022-05-05
  • C語言數(shù)據(jù)結構之隊列算法詳解

    C語言數(shù)據(jù)結構之隊列算法詳解

    這篇文章介紹了C語言數(shù)據(jù)結構之隊列的算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言形參與實參使用的差別講解

    C語言形參與實參使用的差別講解

    形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內都可以使用, 離開該函數(shù)則不能使用。實參出現(xiàn)在主調函數(shù)中,進入被調函數(shù)后,實參變量也不能使用,形參和實參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調用時, 主調函數(shù)把實參的值傳送給被調函數(shù)的形參從而實現(xiàn)主調函數(shù)向被調函數(shù)的數(shù)據(jù)傳送
    2023-02-02
  • Qt實現(xiàn)繪制多個設備的流量曲線圖詳解

    Qt實現(xiàn)繪制多個設備的流量曲線圖詳解

    這篇文章主要為大家詳細介紹了如何使用Qt開發(fā)繪制多個設備的流量曲線圖,文中的示例代碼講解詳細,對我們學習Qt有一定的幫助,需要的可以參考一下
    2023-01-01
  • C++回溯法實例分析

    C++回溯法實例分析

    這篇文章主要介紹了C++回溯法,實例講述了回溯法的原理與實現(xiàn)方法,最后給出了回溯法解決八皇后的實例,需要的朋友可以參考下
    2014-09-09

最新評論