2009-09-10 22 views
5

Tôi đang tìm một ví dụ tốt về cách quá tải toán tử nhập luồng (toán tử >>) để phân tích một số dữ liệu với định dạng văn bản đơn giản. Tôi đã đọc this tutorial nhưng tôi muốn làm điều gì đó tiên tiến hơn một chút. Trong trường hợp của tôi, tôi có các chuỗi cố định mà tôi muốn kiểm tra (và bỏ qua). Giả sử định dạng điểm 2D từ liên kết giống nhưVí dụ về quá tải toán tử trích xuất C++ >> để phân tích cú pháp dữ liệu

Point{0.3 => 
     0.4 } 

nơi tác dụng dự định là phân tích các số 0,3 và 0,4. (Vâng, đây là một cú pháp ngớ ngẩn khủng khiếp, nhưng nó kết hợp một số ý tưởng tôi cần). Chủ yếu là tôi chỉ muốn xem làm thế nào để kiểm tra đúng cho sự hiện diện của chuỗi cố định, bỏ qua khoảng trắng vv

Cập nhật: Rất tiếc, những nhận xét tôi làm dưới đây không có định dạng (đây là lần đầu tiên tôi sử dụng trang web này). tôi thấy rằng khoảng trắng có thể bỏ qua với một cái gì đó giống như

std::cin >> std::ws; 

Và cho ăn lên chuỗi Tôi có

static bool match_string(std::istream &is, const char *str){ 
    size_t nstr = strlen(str); 
    while(nstr){ 
     if(is.peek() == *str){ 
      is.ignore(1); 
      ++str; 
      --nstr; 
     }else{ 
      is.setstate(is.rdstate() | std::ios_base::failbit); 
      return false; 
     } 
    } 
    return true; 
} 

Bây giờ nó sẽ được tốt đẹp để có thể có được vị trí (số dòng) của một lỗi phân tích cú pháp.

Cập nhật 2: Có số dòng và phân tích cú pháp nhận xét đang hoạt động, chỉ sử dụng 1 ký tự nhìn về phía trước. Kết quả cuối cùng có thể được nhìn thấy ở đây trong AArray.cpp, trong hàm parse(). Dự án này là một lớp mảng giống như C++ có thể tuần tự hóa C++.

+0

Đây không phải là toán tử "trích xuất" hoặc "luồng nhập", đó là toán tử "bit shift". Các phiên bản luồng IO là bản thân các phiên bản quá tải của toán tử C ban đầu, được sử dụng khá ít trong thực tế. –

+1

Chris: Mặc dù tôi không đồng ý với bạn, có vẻ như thực tế được chấp nhận để chỉ các toán tử '>>' và '<<' độc lập với tư cách là nhà khai thác "đầu vào/đầu ra luồng". Xem định nghĩa bảng chú giải của Stroustrup về << and >>: http://www.research.att.com/~bs/glossary.html – GRB

+1

@GRB: Quá tải toán tử không. Toán tử dịch bit phải đã bị lạm dụng bởi C++ stl. Xem xét toán tử ^. Bạn có thể quyết định sử dụng toán tử quá tải để biến nó thành một toán tử nâng cao. Tuy nhiên, nó chỉ đơn giản là có ưu tiên sai và kết hợp. Cho rằng các toán tử mới không thể được thêm vào, và ngữ nghĩa của toán tử hiện tại không thể thay đổi được, AND cơ chế ngầm định trong thuật ngữ: "overloading", toán tử >> là toán tử dịch bit phải, và mọi thứ khác được hiểu là một dạng quá tải . –

Trả lời

1

Nhà điều hành của bạn >> (istream &, đối tượng &) sẽ nhận dữ liệu từ luồng đầu vào, sử dụng chức năng trích xuất đã định dạng và/hoặc chưa định dạng và đặt nó vào đối tượng của bạn.

Nếu bạn muốn an toàn hơn (sau thời trang), hãy xây dựng và kiểm tra đối tượng sentry istream :: trước khi bạn bắt đầu. Nếu bạn gặp lỗi cú pháp, bạn có thể gọi setstate(ios_base::failbit) để ngăn chặn bất kỳ quá trình xử lý nào khác cho đến khi bạn gọi my_stream.clear().

Xem <istream> (và istream.tcc nếu bạn đang sử dụng SGI STL) để biết ví dụ.

Các vấn đề liên quan