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