Trong mã C++, tôi có ma trận của các biến kép mà tôi in ra. Tuy nhiên, vì tất cả chúng có số chữ số khác nhau, định dạng đầu ra bị hủy. Một giải pháp là làm cout.precision(5)
nhưng tôi muốn các cột khác nhau có độ chính xác khác nhau. Ngoài ra, bởi vì có những giá trị âm trong một số trường hợp, sự hiện diện của các dấu hiệu -
cũng gây ra vấn đề. Làm thế nào để có được điều này và tạo ra một đầu ra được định dạng đúng?Đầu ra định dạng trong C++
Trả lời
Tắt đầu, bạn có thể sử dụng setw (int) để xác định chiều rộng đầu ra.
như thế này:
std::cout << std::setw(5) << 0.2 << std::setw(10) << 123456 << std::endl;
std::cout << std::setw(5) << 0.12 << std::setw(10) << 123456789 << std::endl;
cho này:
0.2 123456
0.12 123456789
Sử dụng manipulators.
Từ mẫu here:
#include <iostream>
#include <iomanip>
#include <locale>
int main()
{
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << "Left fill:\n" << std::left << std::setfill('*')
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << std::hex << std::showbase << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";
std::cout << "Internal fill:\n" << std::internal
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << "\n\n";
std::cout << "Right fill:\n" << std::right
<< std::setw(12) << -1.23 << '\n'
<< std::setw(12) << 42 << '\n'
<< std::setw(12) << std::put_money(123, true) << '\n';
}
Output:
Left fill:
-1.23*******
0x2a********
USD *1.23***
Internal fill:
-*******1.23
0x********2a
USD ****1.23
Right fill:
*******-1.23
********0x2a
***USD *1.23
Hãy nhìn vào dòng manipulators, đặc biệt là std::setw
và std::setfill
.
float f = 3.1415926535;
std::cout << std::setprecision(5) // precision of floating point output
<< std::setfill(' ') // character used to fill the column
<< std::setw(20) // width of column
<< f << '\n'; // your number
Hãy thử sử dụng trình xử lý setw. Vui lòng tham khảo http://www.cplusplus.com/reference/iostream/manipulators/setw/ để biết thêm thông tin
Có cách sử dụng i/o thao tác, nhưng tôi thấy khó sử dụng. Tôi sẽ chỉ viết một chức năng như sau:
template<typename T>
std::string RightAligned(int size, const T & val)
{
std::string x = boost::lexical_cast<std::string>(val);
if (x.size() < size)
x = std::string(size - x.size(), ' ') + x;
return x;
}
Điều quan trọng là, như những người khác đã nói, sử dụng thao tác. Những gì họ bỏ qua để nói là bạn thường sử dụng các thao tác mà bạn tự viết . Một FFmt
thao túng (tương ứng với định dạng F
trong Fortran là khá dễ dàng:
class FFmt
{
int myWidth;
int myPrecision;
public:
FFmt(int width, int precision)
: myWidth(width)
, myPrecision(precision)
{
}
friend std::ostream&
operator<<(std::ostream& dest, FFmt const& fmt)
{
dest.setf(std::ios_base::fixed, std::ios_base::formatfield);
dest.precision(myPrecision);
dest.width(myWidth);
return dest;
}
};
Bằng cách này, bạn có thể định nghĩa một biến cho mỗi cột, nói:
FFmt col1(8, 2);
FFmt col2(6, 3);
// ...
và viết:
std::cout << col1 << value1
<< ' ' << col2 << value2...
Nói chung, ngoại trừ trong các chương trình đơn giản nhất, có thể bạn không nên là bằng cách sử dụng tiêu chuẩn những người thao túng, mà là những người thao túng tùy chỉnh dựa trên đơn đăng ký của bạn ; ví dụ. temperature
và pressure
nếu đó là loại điều bạn đang xử lý. Theo cách này, rõ ràng là mã số bạn đang định dạng và nếu khách hàng đột nhiên yêu cầu thêm một chữ số ở số áp lực, bạn biết chính xác nơi cần thực hiện thay đổi.
Hãy nhớ rằng bạn cần phải bao gồm
@ user1603472 Có, nhưng mã của tôi không sử dụng 'std :: setw'. –
xin lỗi, xấu của tôi, tôi đã nhấp nhầm địa điểm, là một nhận xét nhanh để đưa vào – user1603472
- 1. C#: DateTime.Now Định dạng đầu ra Tháng
- 2. Đầu ra định dạng
- 3. Định dạng đầu ra trong một bảng, C++
- 4. Định dạng đầu ra của Powershell
- 5. Định dạng đầu ra latex (to_latex)
- 6. Bàn điều khiển định dạng Đầu ra
- 7. cách định dạng đầu ra Json?
- 8. PostScript so với PDF dưới dạng định dạng đầu ra
- 9. định dạng đầu ra đẹp df trong email
- 10. Đầu ra XML được định dạng trong CXF?
- 11. chuỗi json định dạng android trong đầu ra adb logcat
- 12. Tạo đầu ra diff được định dạng trong Java
- 13. Gnu thời gian và định dạng đầu ra
- 14. Formatting C# đầu ra
- 15. jsf đầu ra định dạng html văn bản
- 16. RSpec - đầu ra định dạng như Progress/tài liệu/HTML
- 17. Câu hỏi về định dạng đầu ra XML JAXB
- 18. Định dạng dòng đầu ra, ios :: trái và ios :: đúng
- 19. Tùy chỉnh đầu ra định dạng của .sass?
- 20. Đầu ra CppUnit cho bộ chuyển đổi định dạng TAP
- 21. Cách định dạng/thay đổi đầu ra xây dựng qmake
- 22. Python YAML: Kiểm soát định dạng đầu ra
- 23. định dạng đầu ra của tên tệp ffmpeg
- 24. Cách tạo đầu ra Stream.Write() theo định dạng UTF-8
- 25. Lỗi trên nói khi định dạng đầu ra là sóng
- 26. Định dạng float C++
- 27. Làm thế nào để tạo ra đầu ra dạng bảng trong reStructuredText mà không sử dụng định dạng bảng RST?
- 28. C - Định dạng% x định dạng
- 29. định dạng chuỗi trong C#
- 30. Định dạng kép trong C#
chỉ là FYI: trong khi thực hiện std :: setw (x), hãy đảm bảo x lớn hơn độ chính xác thập phân của bạn. – solti