[英]What happens when I read a file into a string
對於一個小程序,在這里看到,我發現使用 gcc-libstdc++ 和 clang++ - libc++ 將文件內容讀入字符串可以按預期使用 std::string 本身:
std::string filecontents;
{
std::ifstream t(file);
std::stringstream buffer;
buffer << t.rdbuf();
filecontents = buffer.str();
}
后來我修改了字符串。 例如
ending_it = std::find(ending_it, filecontents.end(), '$');
*ending_it = '\\';
auto ending_pos
= static_cast<size_t>(std::distance(filecontents.begin(), ending_it));
filecontents.insert(ending_pos + 1, ")");
即使文件包含非 ascii 字符(如希臘語 lambda),這仍然有效。 我從未搜索過這些 unicode 字符,但它們在字符串中。 后來我 output 字符串到std::cout
。
這是否保證在 C++17(及更高版本)中工作?
問題是:在什么條件下,我可以通過std::ifstream
將文件內容讀入std::string
,像上面那樣處理字符串並期望事情正常工作。
據我所知, std::string
使用char
,它只有 1 個字節。 因此,令我驚訝的是,該方法適用於文件中的非 ascii 字符。
感謝@user4581301 和@PeteBecker 的有用評論讓我理解了這個問題。
這個問題源於一個錯誤的心理 model 的std::string
,或者更根本的是一個錯誤的 model 的char
。 這很好地解釋了here和here 。
我隱含地認為,一個 char 在更通俗的意義上擁有一個“字符”,因此知道它的編碼。 相反,一個字符實際上只包含一個字節(在 c++ 中,在 c 中其定義略有不同)。 因此,將文件讀入字符串始終是明確定義的,因為字符串首先只是一個字節數組。
這也意味着以“字符”可以跨越多個字節的編碼讀取文件會導致這些字符跨越std::string
中的多個索引。 從字符串中輸出單個字符時,可以看出這一點。
幸運的是,只要文件是 ascii 編碼或 utf8 編碼,ascii 字符的字節表示只能在編碼該字符時出現。 這意味着在文件的字符串中搜索一個 ascii 字符將准確地找到這些字符,而不是別的。 因此,上述搜索'$'
並在指向 ascii 字符的索引后插入 substring 的操作不會損壞字符串中的字符。
將字符串輸出到終端,然后只需移交要由終端解釋的字節。 如果終端知道 utf8,它將相應地解釋字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.