2011-07-23 9 views
8

27.6.3.4.2 quản lý đệm và định vịbasic_streambuf :: tìm kiếm những gì cần được trả lại khi ios_base :: in | ios_base :: out được chỉ định?

pos_type seekoff(off_type off, ios_base::seekdir way, 
    ios_base::openmode which = ios_base::in | ios_base::out); 
  • Effects: làm thay đổi vị trí dòng trong vòng một hoặc nhiều trình tự kiểm soát trong một cách mà được xác định riêng cho từng lớp có nguồn gốc từ basic_streambuf trong khoản này (27.8.2.4, 27.9.1.5).
  • Hành vi mặc định: Trả về pos_type(off_type(-1)).

Cho đến nay, rất tốt. Các basic_streambuf dẫn xuất tôi đang sử dụng có thể thay đổi vị trí của nó một cách riêng biệt cho ios_base::in và/hoặc ios_base::out. Nhưng, tôi cần phải trả lại điều gì khi cả hai được chỉ định?

Nếu bạn chỉ định ios_base::inhoặcios_base::out, chúng tôi sẽ trả về vị trí luồng mới của chuỗi cụ thể.

+0

"_Print một cách mà được xác định riêng cho từng class_" là một đặc điểm kỹ thuật, hoặc một trò đùa? – curiousguy

+0

@curiousguy - Ngay cả khi nó có vẻ kỳ lạ, nó thực sự là một đặc điểm kỹ thuật. Nó cho phép các lớp dẫn xuất hoạt động theo một cách hợp lý có thể khác nhau giữa các triển khai và các ca sử dụng khác nhau. Tuy nhiên, nó không phải luôn luôn trực quan như thế nào một thực hiện "nên" hành xử. – 0xbadf00d

+0

"_it thực sự là một specification_" Nhưng nó không phải là. Đó là một ám chỉ đến một số đặc điểm kỹ thuật khác ở một nơi khác. "_Nó cho phép các lớp dẫn xuất hoạt động theo một cách hợp lý có thể khác nhau giữa các cách triển khai khác nhau và các ca sử dụng._" Điểm đặc trưng của "đặc tả" này là gì? Điều gì có thể được thực hiện khi biết rằng 'seekoff' thay đổi vị trí dòng trong một hoặc nhiều chuỗi được kiểm soát theo cách được định nghĩa riêng cho từng lớp dẫn xuất? – curiousguy

Trả lời

1

Có một chút tùy thuộc vào luồng của bạn để xác định điều gì xảy ra. Việc xây dựng trong các luồng khác nhau, trong đó một số có thể có các vị trí đọc và ghi riêng biệt (stringstream) trong khi những người khác chỉ có một (fstream).

Nếu người dùng thực hiện định vị lại và chỉ định cả trong và ngoài, có lẽ bạn nên di chuyển cả hai. Nếu nó là một sự tìm kiếm với một số không bù đắp để có được vị trí hiện tại, nó không phải là không hợp lý để thất bại nếu các vị trí khác nhau.

+0

Một lựa chọn khác sẽ là di chuyển cả hai bằng cách bù đắp, nhưng tôi không biết những gì tôi nên quay trở lại. Tôi nghĩ rằng bạn đúng và sẽ là hợp lý nhất nếu thất bại nếu các vị trí khác nhau. – 0xbadf00d

0

Sau khi tìm kiếm từ 27.8.2.4 có vẻ như bạn dự kiến ​​sẽ thất bại.

Kiểm tra bảng điều kiện 130, trong đó nêu rằng cả hai chuỗi đầu vào và đầu ra nên được bố trí chỉ khi

(which & (ios_base::in | ios_base::out)) == (ios_base::in) | ios_base::out)) 
and way == either ios_base::beg or ios_base::end