簡體   English   中英

C++ - getline 是否有最大字符串或字符容量?

[英]C++ - Does getline have a maximum string or character capacity?

我的問題是關於我正在處理的一項任務。 似乎有多種方法可以完成任務。

我正在編寫的程序將是文本文件的過濾器。 作業的目的是獲得 fstream 和 getline 的經驗。

要求:

  1. 閱讀一個文本文件(任何可能的方式,不必一次全部閱讀)
  2. 寫入單獨的文本文件(任何可能的方式,可以逐個字符附加或寫入)
  3. 假設每個句子都以句號結尾。
  4. 每個句子的第一個字母必須大寫。
  5. 除了每個句子的第一個字母外,所有內容都必須小寫。 (專有名詞也是 - 這是一個微不足道的例子)

我有一個我編寫的程序的工作草案,但是 getline 在讀取我的文本文件的方式上不一致。 基本上,它會將一行讀取為一個字符串,這就是我想要的。 正如它在第二行中所寫的那樣; 但是,該程序在行中途拋出一個運行時錯誤,Windows 將其關閉。

getline 是否有一個緩沖區填滿並需要在每行讀取后清理?

我的程序偽代碼:

  1. 使用 getline 從停在句點 (.) 的第 x 行中讀取字符串。
  2. 迭代字符串字符,大寫第一個字母,然后小寫其余字母。
  3. 在文本文件中的最后一個句點 (.) 之后繼續讀入另一個字符串。
  4. 重復直到讀取文本文件。
  5. 寫入第二個文本文件。

我正在以這種方式實現 getline:

getline(fileIN, str1, '.')

str1 是從每一行讀取的字符串。

我正確使用 getline 嗎? 我是否正確有效地思考了這個問題?

*我在完成這個擴展問題/部分時意識到,getline 可能正在為行尾的 '\\r' 或 '\\n' 字符使用更多內存,或者由於與內存無關的原因,getline 沒有正確處理(根據到我的目的)換行的句子。 getline 不能很好地處理句子/自動換行嗎?

另外,有沒有辦法動態指定 getline 來讀取第一個字符串直到句點 (.) 或換行符 ('\\n'),哪個先出現?

感謝您的時間和考慮。

是的,您正在正確使用getline 確保將其用作while循環或其他條件的條件:

while(std::getline(fileIN, str1, '.')) {
    // process str1
}

並且不要犯許多其他人在嘗試使用fileIN.good()!fileIN.eof()或其他任何東西時!fileIN.eof() (這只會導致頭痛和心痛)。

str1的緩沖區不需要你清理,因為它是由string類管理的。 它將根據需要擴展並在變量超出范圍時釋放自身。 這就是我們喜歡標准庫類並在使用原始數組之前三思的原因之一。

此外,對string的容量沒有人為限制。 唯一的限制因素是系統的可用內存,因此對於虛擬內存,它在 32 位系統上可能略小於 4GB,在 64 位系統上可能略小於 2 64字節。

getline的限制(來自 C 庫)受資源(即內存)的限制,因此您不必擔心太多(除非您有一個單行十億字節的文件)。

STL C++ getline也有類似的限制。

所以你可能不應該太在意,除非你想制作一個防彈程序(然后你可能會關心其他事情,比如 I/O 錯誤、磁盤已滿情況……)。

暫無
暫無

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

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