簡體   English   中英

使用C ++,如何從非二進制文件中讀取特定長度的字符串?

[英]Using C++, how do I read a string of a specific length, from a non-binary file?

讀取文本文件cplusplus.com示例顯示,可以使用getline函數讀取一行。 但是,我不想得到一整條線。 我只想獲取一定數量的字符。 如何以保留字符編碼的方式完成此操作?

我需要一個執行以下操作的函數:

ifstream fileStream;
fileStream.open("file.txt", ios::in);
resultStream << getstring(fileStream, 10); // read first 10 chars
file.ftell(10); // move to the next item
resultStream << getstring(fileStream, 10); // read 10 more chars

我曾考慮過要讀取一個char緩沖區,但這不會更改字符編碼嗎?

我真的懷疑這里的“字符”一詞會引起混淆。 從OP的問題來看,他使用的是“字符”一詞來指代一個char (與邏輯“字符”相對,例如多字節UTF-8字符),因此是出於閱讀文本的目的-文件術語“字符”可以與“字節”互換。

在這種情況下,您可以使用ifstream::read(),從磁盤讀取一定數量的字節ifstream::read(),例如

ifstream fileStream;
fileStream.open("file.txt", ios::in);
char buffer[1024];
fileStream.read(buffer, sizeof(buffer));

讀入char緩沖區根本不會影響字符編碼。 磁盤上存儲的確切字節序列將被復制到緩沖區中。

但是,如果您使用的每個字符都是可變長度的多字節字符集,則情況就不同了。 如果字符不是固定大小,則無法通過一次磁盤讀取就從磁盤中准確讀取N個字符。 這不是C ++的限制,這僅僅是處理塊設備(磁盤)的現實。 在操作系統的最低級別,塊設備以塊為單位尋址,而塊又由字節組成。 因此,您始終可以從磁盤讀取確切數目的字節 ,但不能從磁盤讀取確切數目的邏輯字符 ,除非每個字符都是固定數目的字節。 對於UTF-8這樣的字符集(其中每個字符都是可變長度),您將不得不讀入整個文件,或者執行推測性讀取,並在每次讀取后解析讀取緩沖區,以確定是否需要讀取更多內容。

C ++本身沒有字符編碼的概念。 char的大小始終與wchar_t相同。 因此,如果您需要讀取多字節字符集(例如utf-8)的X個char ,那么您要么必須一次讀取一個(單字節) char (例如,使用getchar() -或X個char ,推測性地,使用istream::getline()並自己測試MBCS信號,或者使用第三方庫來執行此操作。

如果字符集是固定寬度的編碼,並且您不介意在換行時停下來,則可能需要getline() (它允許您指定要讀取的最大字符數)。

正如少數人提到的那樣,C / C ++標准庫實際上並沒有提供在本質上在字節級別以上運行的任何內容。 因此,如果您只想使用核心庫來執行此操作,則沒有現成的選項。

這要么檢查您選擇的平台是否提供另一個實現此功能的庫,要么編寫您自己的解析器以處理字符編碼,要么將類似“ c ++ utf8庫”“ posix unicode”的內容打入Google並查看一下出現。

可能有趣的命中:

我將進一步調查留給讀者。

我認為您可以使用與流緩沖區關聯的流的sgetn成員函數...

char buf [32]; streamsize i = fileStream.rdbuf()-> sgetn(&buf [0],10);

它將讀取10個字符到buf中(如果有10個可讀取的字符),返回讀取的字符數。

暫無
暫無

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

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