首頁 > 後端開發 > C++ > 如何優雅地處理 C 的 `std::getline` 中的不同行結尾?

如何優雅地處理 C 的 `std::getline` 中的不同行結尾?

Patricia Arquette
發布: 2024-12-08 07:59:10
原創
845 人瀏覽過

How to Gracefully Handle Different Line Endings in C  's `std::getline`?

優雅地處理std::istream::getline 中的不同行結尾

讀取文字檔案時,遇到不同的行結尾,例如'n '、'r' 和'rn' 可能會帶來挑戰。 std::getline 是一個從輸入流中檢索行的便捷函數,但它可能會在字串末尾留下殘留的“r”字元。

如 Neil 所指出的,C 運行時通常配備處理基於平台的行結束約定。然而,不同系統之間的互通性需要更強大的方法。

這裡有一個自訂函數,可以無縫處理所有三種行結束類型:

std::istream& safeGetline(std::istream& is, std::string& t)
{
    t.clear();

    std::istream::sentry se(is, true);
    std::streambuf* sb = is.rdbuf();

    for(;;) {
        int c = sb->sbumpc();
        switch (c) {
        case '\n':
            return is;
        case '\r':
            if(sb->sgetc() == '\n')
                sb->sbumpc();
            return is;
        case std::streambuf::traits_type::eof():
            if(t.empty())
                is.setstate(std::ios::eofbit);
            return is;
        default:
            t += (char)c;
        }
    }
}
登入後複製

在此函數中,我們利用Streambuf 物件來高效地一一讀取字符。檢查每個字符,並根據其類型採取適當的操作來處理行結尾。

範例測試程式說明了safeGetline 的用法:

int main()
{
    std::string path = ... // Insert path to test file here

    std::ifstream ifs(path.c_str());
    if(!ifs) {
        std::cout << "Failed to open the file." << std::endl;
        return EXIT_FAILURE;
    }

    int n = 0;
    std::string t;
    while(!safeGetline(ifs, t).eof())
        ++n;
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}
登入後複製

透過採用這種方法,您可以自信地讀取來自不同來源的文字文件,確保優雅地處理不同的行結尾。

以上是如何優雅地處理 C 的 `std::getline` 中的不同行結尾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板