簡體   English   中英

當我將文件讀入字符串時會發生什么

[英]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 這很好地解釋了herehere

我隱含地認為,一個 char 在更通俗的意義上擁有一個“字符”,因此知道它的編碼。 相反,一個字符實際上只包含一個字節(在 c++ 中,在 c 中其定義略有不同)。 因此,將文件讀入字符串始終是明確定義的,因為字符串首先只是一個字節數組。

這也意味着以“字符”可以跨越多個字節的編碼讀取文件會導致這些字符跨越std::string中的多個索引。 從字符串中輸出單個字符時,可以看出這一點。

幸運的是,只要文件是 ascii 編碼或 utf8 編碼,ascii 字符的字節表示只能在編碼該字符時出現。 這意味着在文件的字符串中搜索一個 ascii 字符將准確地找到這些字符,而不是別的。 因此,上述搜索'$'並在指向 ascii 字符的索引后插入 substring 的操作不會損壞字符串中的字符。

將字符串輸出到終端,然后只需移交要由終端解釋的字節。 如果終端知道 utf8,它將相應地解釋字節。

暫無
暫無

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

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