Tôi gặp sự cố khi cố triển khai lớp luồng tùy chỉnh để tạo mã thụt lề độc đáo trong tệp đầu ra. Tôi đã tìm kiếm trực tuyến rộng rãi nhưng dường như không có sự đồng thuận về cách tốt nhất để đạt được điều này. Một số người nói về bắt nguồn suối, những người khác nói về việc suy luận ra đệm, tuy nhiên những người khác đề nghị việc sử dụng các miền địa phương/khía cạnh, vvC++ luồng đầu ra tùy chỉnh với thụt đầu dòng
Về cơ bản, tôi thấy bản thân mình viết rất nhiều mã như thế này:
ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << endl <<
"\t<head>" << endl <<
"\t\t<title>Hello world</title>" << endl <<
"\t</head>" << endl <<
"</html>" << endl;
Khi các tab bắt đầu để thêm lên có vẻ khủng khiếp, và nó có vẻ như nó sẽ được tốt đẹp để có một cái gì đó như thế này:
ind_ofstream myFile();
myFile.open("test.php");
myFile << "<html>" << ind_inc << ind_endl <<
"<head>" << ind_inc << ind_endl <<
"<title>Hello world</title>" << ind_dec << ind_endl <<
"</head>" << ind_dec << ind_endl <<
"</html>" << ind_endl;
tức là tạo ra một lớp dòng có nguồn gốc mà sẽ theo dõi độ sâu thụt như hiện nay, sau đó một số thao tác để tăng/giảm thụt lề chiều sâu, và một người thao túng để viết một dòng mới theo sau bởi nhiều tab.
Vì vậy, đây là bắn tôi tại thực hiện các lớp & thao tác:
ind_ofstream.h
class ind_ofstream : public ofstream
{
public:
ind_ofstream();
void incInd();
void decInd();
size_t getInd();
private:
size_t _ind;
};
ind_ofstream& inc_ind(ind_ofstream& is);
ind_ofstream& dec_ind(ind_ofstream& is);
ind_ofstream& endl_ind(ind_ofstream& is);
ind_ofstream.cpp
ind_ofstream::ind_ofstream() : ofstream() {_ind = 0;}
void ind_ofstream::incInd() {_ind++;}
void ind_ofstream::decInd() {if(_ind > 0) _ind--;}
size_t ind_ofstream::getInd() {return _ind;}
ind_ofstream& inc_ind(ind_ofstream& is)
{
is.incInd();
return is;
}
ind_ofstream& dec_ind(ind_ofstream& is)
{
is.decInd();
return is;
}
ind_ofstream& endl_ind(ind_ofstream& is)
{
size_t i = is.getInd();
is << endl;
while(i-- > 0) is << "\t";
return is;
}
này được xây dựng, nhưng không tạo ra kết quả mong muốn ; bất kỳ nỗ lực nào để sử dụng các trình điều khiển tùy chỉnh dẫn đến việc chúng được truyền tới một boolean vì một lý do nào đó và "1" được ghi vào tệp. Tôi có cần quá tải toán tử < < cho lớp mới của mình không? (Tôi đã không thể tìm thấy cách để làm điều này mà xây dựng)
Cảm ơn!
p.s.
1) Tôi đã bỏ qua #includes, sử dụng không gian tên vv từ đoạn mã của tôi để tiết kiệm dung lượng.
2) Tôi đang hướng đến việc có thể sử dụng giao diện tương tự như giao diện trong đoạn mã thứ hai của mình. Nếu sau khi đọc toàn bộ bài đăng, bạn nghĩ đó là một ý tưởng tồi, vui lòng giải thích lý do và cung cấp giải pháp thay thế.
Câu hỏi: nếu kết quả mong muốn là mã sạch và đầu ra chính xác - nghĩa là, nếu đây không chỉ là học thuật hoặc cho sự cải thiện của bạn - tại sao viết [HT | X] ML trực tiếp theo cách này? Ít nhất, bạn có thể viết nó vào đĩa Unindented, sau đó sử dụng một số prettifier (gọn gàng, ví dụ) để làm công việc bẩn thỉu này. ... điều đó đang được nói, điều đó thật thú vị, và tôi có một cảm giác béo bở, tôi sẽ sớm kết hợp một giải pháp với nhau. :) – Christopher
Xin chào - đó là một ý tưởng hay và có lẽ những gì tôi sẽ làm nếu tôi không thể lên kế hoạch làm việc. Tôi thấy các luồng là một trong những khía cạnh khó hiểu hơn của C++, vì vậy tôi nghĩ đây có thể là một cách hay để hiểu sâu hơn về cách chúng hoạt động ... – user1898153