mã sau đây không hoạt động như tôi mong đợi. Xin hãy giúp tôi hiểu nó hoạt động ra sao.thuật toán sao chép với ifstream
#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
struct user
{
string name;
string age;
string id;
};
istream& operator>>(istream& is, user& s)
{
getline(is, s.name, ':');
getline(is, s.age, ':');
getline(is, s.id);
return is;
}
int main(int argc, char* argv[])
{
ifstream file("file.txt");
vector<user> vec;
copy(istream_iterator<user>(file), istream_iterator<user>(), back_inserter(vec));
return 0;
}
điều hành tùy chỉnh của tôi >> được gọi là hai lần nhưng tôi mong chờ nó được gọi là chỉ một lần vì các nội dung bao gồm:
John: bốn mươi: 21-5821-0
Làm thế nào để bạn biết nó được gọi là hai lần? Đã kiểm tra trong trình gỡ lỗi? Bạn nhận được hai mục trong vectơ? Nếu cuối cùng, cả hai mục đều giống nhau không? –
+1, đã có cùng một vấn đề gần đây ... vì một lý do nào đó, việc tăng iterator trong mã 'copy' đã gây ra việc đọc, thay vì dereferencing, do đó nó thực hiện một lần đọc quá nhiều. Điều đó nói rằng, 'toán tử >>' của bạn cần phải kiểm tra trạng thái sau hai hoạt động 'getline' đầu tiên! –
Thật vô nghĩa khi lo lắng về mã I/O không kiểm tra các giá trị trả lại. Bạn phải * luôn luôn * kiểm tra giá trị trả về của các hoạt động I/O. –