2012-06-23 51 views
5

Tôi muốn cung cấp khả năng giống tab cho luồng đầu ra văn bản C++. Tính năng này cho phép tôi nói "lưu ý vị trí này", sau đó cho phép nhiều thao tác chèn và cuối cùng cho phép tôi nói "thêm đủ ký tự điền để kết thúc các ký tự N qua vị trí được ghi chú ban đầu".tại sao cout.tellp luôn trả về -1?

Hệ thống tiêu chuẩn iostream dường như không duy trì vị trí cột nhưng tôi đã nghĩ rằng tôi có thể giả mạo nó bằng cách sử dụng tellp(). Giả định của tôi là sự khác biệt giữa tellp() tại hai điểm trong chuỗi đầu ra của tôi sẽ tương ứng với số byte can thiệp.

Thật không may, ít nhất trong môi trường Gnu C++ của tôi, cout không duy trì tiểu thuyết của vị trí phát trực tuyến. Mỗi cout.tellp() gọi returns -1. Tại sao vậy?

+6

'tellp' không bao giờ là vị trí cột trong bất kỳ luồng nào. Nó chỉ có ý nghĩa trong các luồng có thể tìm kiếm được. –

+1

@ R.MartinhoFernandes là chính xác. 'tellp' là nghĩa vụ phải cho bạn biết giá trị để cung cấp cho' seekp' để trở lại vị trí hiện tại. Trong trường hợp này, nó nói với bạn rằng không có khả năng như vậy. Entabbing phải được hỗ trợ theo cách khác. –

+0

Cảm ơn cả hai. Đó là mối quan hệ để tìm kiếm mà tôi không nắm bắt được. –

Trả lời

2

tellp trả về vị trí trong luồng để bạn có thể tìm kiếm. Bảng điều khiển không cho phép tìm kiếm. Bên cạnh đó, ngay cả khi bạn giải thích vị trí là "số byte được ghi vào luồng từ khi nó được tạo", con số đó sẽ không được sử dụng để định vị con trỏ - màn hình kết thúc tốt đẹp, chiều rộng của nó thường không thể đoán trước. Bạn sẽ không biết bạn đang ở cột nào vì chiều dài hàng là biến.

Nếu bạn muốn định vị con trỏ hợp lý trên màn hình, hãy kiểm tra đặc tả thiết bị đầu cuối ANSI và thoát các lệnh đi kèm với nó. Chúng cho phép phát hiện vị trí con trỏ và vị trí.

http://ascii-table.com/ansi-escape-sequences.php

+0

Cảm ơn Seva. Đó là mối quan hệ giữa seekp và tellp mà tôi đã không nắm bắt được. –

+0

Cảm ơn @Seva. Tôi không cố gắng thao tác với con trỏ. Đối với alignmnet tôi chỉ muốn phát ra các giá trị hợp lý trái với dấu chấm câu vào các cột cố định chiều rộng (ví dụ: "1:" và "12:"). Bởi vì điều này đòi hỏi nhiều hơn rằng một hoạt động chèn đơn, độ rộng tiêu chuẩn() thao tác là không đủ. Nếu bạn đọc lại câu hỏi ban đầu của mình, bạn sẽ thấy rằng tôi không có ý định diễn giải cho tellp() như một vị trí cột. Đó là sự khác biệt giữa hai lệnh gọi đến tellp() mà tôi mong đợi sẽ cho phép tôi xác định có bao nhiêu byte được chèn vào giữa chúng. –

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