最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年08月26日 10:17:32   作者:photon_wa  
?std::ifstream::readsome和std::ifstream::read?的主要區(qū)別在于它們處理輸入流的方式和可能返回的結(jié)果,下面給大家介紹C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧

‌std::ifstream::readsome和std::ifstream::read的主要區(qū)別在于它們處理輸入流的方式和可能返回的結(jié)果。

  • 處理方式‌:
  •  
    • std::ifstream::readsome 是一個(gè)非阻塞的讀取函數(shù),它嘗試從輸入流中讀取一些數(shù)據(jù),即使到達(dá)文件末尾(EOF)也不會(huì)立即停止,而是返回已經(jīng)讀取的字節(jié)數(shù)。這意味著,如果在讀取過程中遇到EOF,readsome會(huì)返回已經(jīng)讀取的數(shù)據(jù),而不是等待直到有更多數(shù)據(jù)可用或直到達(dá)到請(qǐng)求的數(shù)量。
    • std::ifstream::read 是一個(gè)阻塞的讀取函數(shù),它會(huì)嘗試讀取指定數(shù)量的字節(jié),如果數(shù)據(jù)不可用,它會(huì)等待直到達(dá)到請(qǐng)求的數(shù)量或者遇到EOF。在達(dá)到EOF時(shí),read會(huì)設(shè)置EOF標(biāo)志并返回0,表示沒有更多數(shù)據(jù)可以讀取。
  •  

    返回值‌:

    • std::ifstream::readsome 返回實(shí)際讀取的字符數(shù),或者在發(fā)生錯(cuò)誤時(shí)返回一個(gè)特殊的值(如流錯(cuò)誤狀態(tài))。這個(gè)函數(shù)不會(huì)因?yàn)榈竭_(dá)EOF而立即停止,因此可能會(huì)返回一個(gè)比請(qǐng)求的數(shù)量少的值。
    • std::ifstream::read 返回實(shí)際讀取的字符數(shù),或者在發(fā)生錯(cuò)誤時(shí)設(shè)置錯(cuò)誤狀態(tài)并返回一個(gè)特殊的值。當(dāng)?shù)竭_(dá)文件末尾時(shí),它會(huì)返回0,表示沒有更多數(shù)據(jù)可以讀取。
  •  

    應(yīng)用場(chǎng)景‌:

    • 當(dāng)您不確定輸入流中是否有足夠的數(shù)據(jù)時(shí),或者當(dāng)您希望程序在等待數(shù)據(jù)的同時(shí)繼續(xù)執(zhí)行其他任務(wù)時(shí),std::ifstream::readsome 是一個(gè)合適的選擇。它允許程序在數(shù)據(jù)可用時(shí)繼續(xù)處理,而不是完全阻塞等待所有數(shù)據(jù)都準(zhǔn)備好。
    • 當(dāng)您需要確保讀取特定數(shù)量的數(shù)據(jù),或者當(dāng)您確信輸入流中有足夠的數(shù)據(jù)時(shí),std::ifstream::read 是更合適的選擇。它提供了更明確的控制,確保程序在數(shù)據(jù)不足時(shí)不繼續(xù)執(zhí)行。

總的來說,選擇使用std::ifstream::readsome還是std::ifstream::read取決于您的具體需求:如果您希望程序在數(shù)據(jù)可用時(shí)立即處理,并且不介意可能讀取到的數(shù)據(jù)量少于請(qǐng)求的量,那么std::ifstream::readsome是合適的選擇;如果您需要確保讀取到確切數(shù)量的數(shù)據(jù),或者當(dāng)數(shù)據(jù)不足時(shí)不進(jìn)行任何操作,那么應(yīng)該使用std::ifstream::read‌1。

‌std::ifstream::readsome和std::ifstream::read‌的主要區(qū)別在于它們處理輸入流的方式和可能返回的結(jié)果。

  •  

    處理方式‌:

    • std::ifstream::readsome 是一個(gè)非阻塞的讀取函數(shù),它嘗試從輸入流中讀取一些數(shù)據(jù),即使到達(dá)文件末尾(EOF)也不會(huì)立即停止,而是返回已經(jīng)讀取的字節(jié)數(shù)。這意味著,如果在讀取過程中遇到EOF,readsome會(huì)返回已經(jīng)讀取的數(shù)據(jù),而不是等待直到有更多數(shù)據(jù)可用或直到達(dá)到請(qǐng)求的數(shù)量。
    • std::ifstream::read 是一個(gè)阻塞的讀取函數(shù),它會(huì)嘗試讀取指定數(shù)量的字節(jié),如果數(shù)據(jù)不可用,它會(huì)等待直到達(dá)到請(qǐng)求的數(shù)量或者遇到EOF。在達(dá)到EOF時(shí),read會(huì)設(shè)置EOF標(biāo)志并返回0,表示沒有更多數(shù)據(jù)可以讀取。
  •  

    返回值‌:

    • std::ifstream::readsome 返回實(shí)際讀取的字符數(shù),或者在發(fā)生錯(cuò)誤時(shí)返回一個(gè)特殊的值(如流錯(cuò)誤狀態(tài))。這個(gè)函數(shù)不會(huì)因?yàn)榈竭_(dá)EOF而立即停止,因此可能會(huì)返回一個(gè)比請(qǐng)求的數(shù)量少的值。
    • std::ifstream::read 返回實(shí)際讀取的字符數(shù),或者在發(fā)生錯(cuò)誤時(shí)設(shè)置錯(cuò)誤狀態(tài)并返回一個(gè)特殊的值。當(dāng)?shù)竭_(dá)文件末尾時(shí),它會(huì)返回0,表示沒有更多數(shù)據(jù)可以讀取。
  •  

    應(yīng)用場(chǎng)景‌:

    • 當(dāng)您不確定輸入流中是否有足夠的數(shù)據(jù)時(shí),或者當(dāng)您希望程序在等待數(shù)據(jù)的同時(shí)繼續(xù)執(zhí)行其他任務(wù)時(shí),std::ifstream::readsome 是一個(gè)合適的選擇。它允許程序在數(shù)據(jù)可用時(shí)繼續(xù)處理,而不是完全阻塞等待所有數(shù)據(jù)都準(zhǔn)備好。
    • 當(dāng)您需要確保讀取特定數(shù)量的數(shù)據(jù),或者當(dāng)您確信輸入流中有足夠的數(shù)據(jù)時(shí),std::ifstream::read 是更合適的選擇。它提供了更明確的控制,確保程序在數(shù)據(jù)不足時(shí)不繼續(xù)執(zhí)行。

總的來說,選擇使用std::ifstream::readsome還是std::ifstream::read取決于您的具體需求:如果您希望程序在數(shù)據(jù)可用時(shí)立即處理,并且不介意可能讀取到的數(shù)據(jù)量少于請(qǐng)求的量,那么std::ifstream::readsome是合適的選擇;如果您需要確保讀取到確切數(shù)量的數(shù)據(jù),或者當(dāng)數(shù)據(jù)不足時(shí)不進(jìn)行任何操作,那么應(yīng)該使用std::ifstream::read

下面示例介紹C++中std::ifstream::readsome和std::ifstream::read的區(qū)別。

std::ifstream::readsome的原型如下,可以返回實(shí)際讀到的字節(jié)數(shù)量,但是不會(huì)把eofbit置1,所以不能直接調(diào)用eof判斷是否到文件尾

streamsize readsome (char* s, streamsize n);

std::ifstream::read原型如下,會(huì)置eof, 但沒法直接得到實(shí)際讀取字節(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

到此這篇關(guān)于std::ifstream::readsome和std::ifstream::read的區(qū)別的文章就介紹到這了,更多相關(guān)std::ifstream::readsome和std::ifstream::read區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++簡(jiǎn)單集合類的實(shí)現(xiàn)方法

    C++簡(jiǎn)單集合類的實(shí)現(xiàn)方法

    如何使用C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的集合類,這篇文章主要介紹了C++簡(jiǎn)單集合類的實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-07-07
  • .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    .h和.cpp文件的區(qū)別(zt)詳細(xì)介紹

    特別是對(duì)源文件和頭文件的概念,需要深入對(duì)它了解,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-11-11
  • C++高性能服務(wù)器框架之線程模塊

    C++高性能服務(wù)器框架之線程模塊

    該模塊基于pthread實(shí)現(xiàn),sylar說,由于c++11中的thread也是由pthread封裝實(shí)現(xiàn)的,并且沒有提供讀寫互斥量,讀寫鎖,自旋鎖等,所以自己封裝了pthread,本文主要詳細(xì)介紹了C++高性能服務(wù)器框架中的線程模塊,需要的朋友可以參考下
    2023-06-06
  • C語言實(shí)現(xiàn)Fibonacci數(shù)列遞歸

    C語言實(shí)現(xiàn)Fibonacci數(shù)列遞歸

    這篇文章主要介紹了C語言實(shí)現(xiàn)Fibonacci數(shù)列遞歸,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解

    c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解

    這篇文章主要為大家介紹了c與c++相互調(diào)用的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • C++STL中<functional>的具體使用

    C++STL中<functional>的具體使用

    C++標(biāo)準(zhǔn)庫中的<functional>庫是一個(gè)強(qiáng)大的工具集,它提供了用于處理函數(shù)對(duì)象、函數(shù)綁定、函數(shù)包裝等功能的設(shè)施,極大地增強(qiáng)了代碼的靈活性和可復(fù)用性,感興趣的可以了解一下
    2025-11-11
  • C++20新增屬性[[no_unique_address]]詳解(最新整理)

    C++20新增屬性[[no_unique_address]]詳解(最新整理)

    [[no_unique_address]]讓空類型的類數(shù)據(jù)成員有機(jī)會(huì)不再占用額外的內(nèi)存空間,從而減輕了因?yàn)榈刂芬?guī)定帶來的性能影響,同時(shí)還讓空基類優(yōu)化代碼得到了簡(jiǎn)化的機(jī)會(huì),本文給大家詳細(xì)介紹C++20新增屬性[[no_unique_address]],感興趣的朋友一起看看吧
    2025-09-09
  • KMP 算法實(shí)例詳解

    KMP 算法實(shí)例詳解

    這篇文章主要介紹了KMP 算法實(shí)例詳解的相關(guān)資料,MP的關(guān)鍵是求出next的值、先預(yù)處理出next的值,需要的朋友可以參考下
    2017-07-07
  • 在C++?中慎用setjmp和longjmp解析

    在C++?中慎用setjmp和longjmp解析

    setjmp和longjmp是C語言中用于實(shí)現(xiàn)非局部跳轉(zhuǎn)的函數(shù),setjmp和longjmp 是 C 語言中一個(gè)很強(qiáng)大的函數(shù),這篇文章主要介紹了在C++?中慎用setjmp和longjmp的相關(guān)知識(shí),需要的朋友可以參考下
    2023-06-06
  • 基于Matlab實(shí)現(xiàn)數(shù)字音頻分析處理系統(tǒng)

    基于Matlab實(shí)現(xiàn)數(shù)字音頻分析處理系統(tǒng)

    這篇文章主要為大家介紹了如何利用Matlab制作一個(gè)帶GUI的數(shù)字音頻分析與處理系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-02-02

最新評(píng)論

大洼县| 方城县| 准格尔旗| 平罗县| 皮山县| 灵璧县| 孝感市| 达日县| 清徐县| 鸡泽县| 喀什市| 普洱| 奇台县| 黔东| 大厂| 岫岩| 庆阳市| 安西县| 天等县| 新丰县| 浦东新区| 浦北县| 宝清县| 平顺县| 白朗县| 洪江市| 巴林右旗| 昭觉县| 青浦区| 化州市| 云和县| 雷波县| 尼勒克县| 桃园县| 南丰县| 玛多县| 滨州市| 齐齐哈尔市| 福州市| 民丰县| 新竹县|