Câu hỏi stdout và cần phải tuôn ra nó C ++


Tôi có một số mã C ++ sử dụng cout báo cáo cho mục đích gỡ lỗi và vì một lý do nào đó tôi không thể lấy tất cả dữ liệu cần in trừ khi tôi thực hiện std::cout.flush(); cuối cùng.

Tôi không hoàn toàn hiểu tại sao hoạt động tuôn ra này là cần thiết.

Bất cứ ai có bất kỳ cái nhìn sâu sắc?


15
2018-06-02 12:40


gốc


Xin vui lòng không chỉnh sửa câu hỏi của tôi, cảm ơn. - Dixon Steel


Các câu trả lời:


Để thêm vào các câu trả lời khác: thay vào đó, các báo cáo gỡ lỗi của bạn sẽ chuyển đến cerr, bởi vì:

  • nó ghi vào lỗi chuẩn, có nghĩa là, chạy ứng dụng, bạn có thể dễ dàng tách đầu ra chương trình "bình thường" khỏi thông tin lỗi / gỡ lỗi thông qua chuyển hướng;
  • quan trọng nhất, cerr theo mặc định là không bị cản trở, có nghĩa là, sau mỗi thao tác đầu ra, nó sẽ tự động tuôn ra chính nó, và nói chung điều này là mong muốn đối với các lỗi và đầu ra gỡ lỗi.

(nguồn: tiêu chuẩn C ++, §27.3.1 ¶4-5, §27.4.2.1.2 bảng 83)


10
2018-06-02 12:56



Cảm ơn, tôi sẽ nhớ điều này để tham khảo trong tương lai, tôi thường không quan tâm vì tôi sẽ loại bỏ các tuyên bố cout của tôi nhưng dự án này đã là một nỗi đau của hoàng gia. Tôi ghét mã của bên thứ ba. - Dixon Steel


Bạn đang sử dụng std::endl để chấm dứt các dòng của bạn. Đây phải là thực hành thông thường, cho đến khi các vấn đề hiệu suất yêu cầu khác, nhưng đối với một số lý do, tôi thấy rất nhiều mã sử dụng '\n' thay thế.

Nếu không, bạn luôn có thể làm:

std::cout.setf( std::ios_base::unitbuf );

là một trong những điều đầu tiên trong main. Điều này sẽ gây ra một tuôn ra ở kết thúc mọi <<, đó là nhiều hơn bạn cần, nhưng để chẩn đoán đầu ra cho giao diện điều khiển, có lẽ là khá chấp nhận được.


9
2018-06-02 12:59



Có, tôi làm như một thói quen, nhưng một số mã tôi đang tích hợp không và nó khá lớn đối với tôi để "sửa" nó .. - Dixon Steel
@ Dixon Steel Tôi biết cảm giác. Đó là lý do tại sao tôi đưa ra gợi ý thứ hai, sử dụng unitbuf. - James Kanze


Dữ liệu không tự động bị xóa \n cuối cùng? Theo mặc định, tiêu chuẩn ra không được phân phối cho đến khi một trở về vận chuyển được nhìn thấy.


4
2018-06-02 12:42



Nếu tôi gửi một endl nó sẽ in là tốt, nhưng tôi nghĩ trong C + + đó là giống như một hoạt động tuôn ra? - Dixon Steel
Việc vận chuyển trở lại được sử dụng như là một "điểm tuôn ra", nếu bạn muốn. Hãy nhớ rằng C chia sẻ cùng một I / O cơ bản như C ++ và C thiếu endl, tuy nhiên \ n vẫn thực hiện thủ thuật. std :: endl có thể thực sự buộc tuôn ra; Tôi cần phải kiểm tra việc thực hiện nó (hoặc nghe từ ai đó có) để chắc chắn. - mah
Cái này sai. Tiêu chuẩn ra là không phải dòng đệm. Nơi đệm có liên quan, iostream hoạt động khác biệt đáng kể so với FILE. std::cout sẽ bị xóa bởi một cuộc gọi rõ ràng tới flush (bao gồm cả kích hoạt bởi std::endl hoặc bằng cách đọc std::cin), hoặc vào những thời điểm không xác định khác do quyết định thực hiện. Không có dòng đệm trong iostream. - James Kanze
std :: endl Là một hoạt động tuôn ra, không chỉ là một dòng mới. '\ n' sẽ không tuôn ra, std :: endl sẽ xóa một iostream. - berkus
CHÚA ƠI! Những người phát triển phiên bản gdb của MinGW không biết, rằng không ai thiết lập trả lại vận chuyển. Chỉ là khủng khiếp! Mã của tôi hoạt động hoàn toàn trên GNU / Linux, nhưng kể từ khi tôi chạy nó cho Windows®, các bản in đã bị rối tung chỉ trong gdb, không phải trong thiết bị đầu cuối đơn giản. Và điều này đã trở thành cố định chỉ khi tôi thêm \r ký tên. Tôi không có ý kiến. @Mah, nhân tiện, như tôi biết, các stdout nên được flushed không phải trên một «trở về vận chuyển», nhưng trên một «newline». - Hi-Angel


Thay vào đó, nó có thể chờ trong bộ đệm cho đến khi một số sự kiện không xác định, ví dụ: bộ đệm đủ đầy đủ, đọc từ đầu vào hoặc thoát khỏi chương trình. Các chi tiết có thể khác nhau. "

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html


1
2018-06-02 12:43



Vì vậy, điều này có nghĩa là sản lượng có thể được không thể đoán trước và tôi không thực sự có một lỗi hoặc bế tắc trên dòng? - Dixon Steel
Chính xác. Tuôn ra nó để dự đoán đầy đủ. :) - Christian Neverdal


Câu trả lời của std::endl chỉ hợp lệ nếu bạn muốn trả lại. Bạn không chắc chắn làm thế nào bạn sẽ làm điều này nếu bạn muốn tuôn ra một dấu nhắc lệnh ra ngoài.


0
2018-04-28 18:36





Trong C ++ bạn có thể sử dụng endl trình định dạng với cout nhà điều hành thay vì flush.


0
2018-06-02 12:47





Đó là hành vi đúng đắn. Bạn có thể sử dụng std::endl thêm \n và xả bộ đệm. http://www.cplusplus.com/reference/ostream/endl/

Bạn cần phải tuôn ra luồng, nếu bạn muốn xem đầu ra.


0
2018-06-02 12:45