簡體   English   中英

完整性檢查:從 streambuf 派生類的返回?EOF 溢出 function 是否有意義?

[英]Sanity check: Does returning !EOF from streambuf-derived class' overflow function make sense?

關於重寫的 std::streambuf::overflow function 應該如何簡單地獲取寫入 stream 的每個字符,我幾乎找不到有用的信息。所以我向 ChatGPT 詢問了一些指示。 它不斷回到這個概念:

int overflow(int c)
{
    if (c == EOF)
    {
        // Flush the buffer here
        return !EOF;
    }
    // Put c in the buffer here
    if (c == '\n')
    {
        // Flush the buffer here
    }
    return c;
}

當 c 是EOF時,它返回!EOF真是太奇怪了。
文檔沒有詳細說明“成功”的含義。
This page說它應該返回EOF (不是!EOF )當以EOF作為參數調用時(或發出“失敗”信號時)。

所以:我懷疑在這里返回!EOF是錯誤的並且我應該返回EOF是否正確?
如果您能告訴我 ChatGPT 從哪里得到這個想法,請使用 Cookie 點數。 我找不到return;EOF; inte.net 上的任何其他地方。

這是 C++ 標准對返回值的描述:

[streambuf.virt.put]

 int_type overflow(int_type c = traits::eof());

6返回: traits::eof()或如果 function 失敗則拋出異常。
否則,返回traits::eof()以外的一些值以指示成功。(304)

(腳注 304)通常, overflow返回c以指示成功,除非traits::eq_int_type(c, traits::eof())返回true ,在這種情況下它返回traits::not_eof(c)

因此,具體的返回值並不重要,重要的是它是否為traits::eof() 您可能想要遵循一個(非規范的)約定。

回復:“成功”是什么意思:

[streambuf.virt.put]/5要求:此虛擬 function 的每個覆蓋定義都應遵守以下約束:
...

  1. r為待處理序列中未消耗的字符數。 如果r為非零值,則應設置 pbase( pbase()pptr()以便: pptr() - pbase() == r並且從 pbase pbase()開始的r字符是關聯的 output stream。如果r全部為零(待處理序列的字符已被消耗)然后將pbase()設置為nullptr ,或者 pbase( pbase()pptr()都設置為相同的非空值。
  2. 如果向關聯的 output stream 附加一些字符失敗,或者無法根據上述規則建立 pbase( pbase()pptr() ,則 function 可能會失敗。

因此,如果 function 無法實際寫入底層介質,或者無法恢復不變量,則會失敗。 如果它管理兩者,它就會成功。

暫無
暫無

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

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