AFAIK std :: thuật toán sao chép không kiểm tra bất kỳ thứ gì và chỉ lặp qua tất cả các phần tử và sao chép chúng vào trình lặp đầu ra. Điều này có nghĩa là bạn nên cung cấp đủ không gian trong bản lặp đầu ra nếu không hành vi không được chỉ định.
Vì vậy, trong trường hợp của bạn, bạn nên tự kiểm tra xem tệp đầu ra có ghi được không, vv .. Một trong những cách có thể để kiểm tra điều này, tôi nghĩ sử dụng cờ lỗi cho luồng tệp bạn đang sử dụng, tức là sau khi sao chép ofstream
là good
(bạn có thể sử dụng good()
, eof()
, fail()
và bad()
chức năng cho việc này).
Cách tiếp cận thứ hai là kiểm tra giá trị trả lại của std::copy
. Khi nó trả về một iterator đến cuối dãy đích (trỏ đến phần tử sau bản sao cuối cùng) thì bạn có thể tính toán sự khác biệt giữa giá trị trả về của std::copy
và trình lặp đầu ra của bạn và đảm bảo rằng nó bằng với kích thước của deque
của bạn. Ví dụ. (Giả)
OutputIterator result = std::copy(input.begin(), input.end(), output);
assert(result - output == input.end() - input.begin());
EDIT: Cách tiếp cận thứ hai chỉ hoạt động khi output
cũng là input type iterator, vì vậy std::distance
để làm việc cho nó. Sẽ chính xác hơn khi viết:
assert(std::distance(output, result) == std::distance(input.begin(), input.end()));
Nguồn
2012-03-13 10:04:58
Bạn không thể kiểm tra [trạng thái I/O luồng] (http://en.cppreference.com/w/cpp/io/ios_base/iostate)? –