簡體   English   中英

檢查 istreambuf_iterator 失敗

[英]Check istreambuf_iterator fail

我們可以將整個文件讀入一個字符串:

std::ifstream ifs(path);
assert(ifs.good());
std::string text(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>())

一旦此代碼返回一個空字符串。 如何檢查讀取過程中沒有錯誤?

更新:

我了解到,如果一個文件正在被寫入(或剛剛被覆蓋),那么當我讀取該文件時,std::filesystem::file_size 可能返回 0,並且 ifstream 從 operator bool 返回 true(在 Windows 上)。 所以該文件在一段時間內不可用,但我沒有收到任何錯誤,我無法將這種情況與真正的空文件的情況區分開來。 所以我必須在循環中讀取一個文件,而它的大小為 0 一段時間。

檢查流是否有錯誤的最簡單方法是在對流進行每次操作后使用operator bool

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::string file_name{"data.txt"};
    std::ifstream ifs(file_name);
    if ( !ifs)  // <---
        std::cout << "Error: unable to open " << file_name << ".\n";

    std::string text{ std::istreambuf_iterator<char>(ifs),
                      std::istreambuf_iterator<char>() };
    //              ^                                  ^

    if ( ifs )  // <--                    
        std::cout << text << '\n';
    else 
        std::cout << "An error occured while reading the file.\n";
}

請注意,OP 的代碼段受到Most Vexing Parse 的影響,可以使用字符串的 列表初始化來修復。

暫無
暫無

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

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