[英]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.