Tôi có một bộ mô tả tập tin Linux (từ ổ cắm), và tôi muốn đọc một dòng. Làm thế nào để làm điều đó trong C + +?Làm thế nào để đọc chính xác một dòng?
Trả lời
Mã giả:
char newline = '\n';
file fd;
initialize(fd);
string line;
char c;
while(newline != (c = readchar(fd))) {
line.append(c);
}
Something như thế.
Tôi đang đọc từ ổ cắm TCP mà bạn không thể giả định khi kết thúc dòng. Vì vậy, bạn sẽ cần một cái gì đó như thế:
std::string line;
char buf[1024];
int n = 0;
while(n = read(fd, buf, 1024))
{
const int pos = std::find(buf, buf + n, '\n')
if(pos != std::string::npos)
{
if (pos < 1024-1 && buf[pos + 1] == '\n')
break;
}
line += buf;
}
line += buf;
Giả sử bạn đang sử dụng "\ n \ n" làm dấu phân cách. (Tôi đã không kiểm tra đoạn mã đó ;-))
Trên ổ cắm UDP, đó là một câu chuyện khác. Emiter có thể gửi một paquet chứa toàn bộ một dòng. Người nhận được garanted để nhận paquet như là một đơn vị duy nhất .. Nếu nó nhận được nó, như UDP là không đáng tin cậy như TCP của khóa học.
Đó là về TCP, vâng. Vấn đề là ổ cắm là tương tác. Tôi phải gửi một dòng, sau đó tôi nhận được một vài dòng. Tôi có thể nhận ra kết thúc bằng dòng mới kép "\ n \ n". –
... vì vậy tôi không thể đọc trước 1024 ký tự vì có thể không quá nhiều. người đàn ông 2 đọc cho thấy rằng POSIX đọc có 3 đối số, vì vậy tôi không biết bạn đang đọc cái gì. –
như tôi đã nói với bạn tôi đã không kiểm tra nó. Tôi chỉ viết 'ngay lập tức'. Mã dễ hiểu và thích ứng. Nhân tiện, tôi đã cập nhật nó để tính đến các dấu phân cách dòng của bạn: "\ n \ n" –
Sử dụng C++ socket thư viện:
class LineSocket : public TcpSocket { public: LineSocket(ISocketHandler& h) : TcpSocket(h) { SetLineProtocol(); // enable OnLine callback } void OnLine(const std::string& line) { std::cout << "Received line: " << line << std::endl; // send reply here { Send("Reply\n"); } } };
Và bằng cách sử dụng lớp trên:
int main() { try { SocketHandler h; LineSocket sock(h); sock.Open("remote.host.com", port); h.Add(&sock); while (h.GetCount()) { h.Select(); } } catch (const Exception& e) { std::cerr << e.ToString() << std::endl; } }
Thư viện chăm sóc của tất cả các xử lý lỗi.
Tìm thư viện sử dụng google hoặc sử dụng liên kết trực tiếp này: http://www.alhem.net/Sockets/
Dưới đây là một thử nghiệm, mã khá hiệu quả:
bool ReadLine (int fd, string* line) {
// We read-ahead, so we store in static buffer
// what we already read, but not yet returned by ReadLine.
static string buffer;
// Do the real reading from fd until buffer has '\n'.
string::iterator pos;
while ((pos = find (buffer.begin(), buffer.end(), '\n')) == buffer.end()) {
char buf [1025];
int n = read (fd, buf, 1024);
if (n == -1) { // handle errors
*line = buffer;
buffer = "";
return false;
}
buf [n] = 0;
buffer += buf;
}
// Split the buffer around '\n' found and return first part.
*line = string (buffer.begin(), pos);
buffer = string (pos + 1, buffer.end());
return true;
}
Nó cũng hữu ích để thiết lập tín hiệu SIGPIPE phớt lờ trong việc đọc và viết (và xử lý lỗi như được hiển thị ở trên):
signal (SIGPIPE, SIG_IGN);
- 1. Làm thế nào để đọc một dòng với "CSV?
- 2. Làm thế nào để xử lý một waithandle chính xác
- 3. IntentService: Làm thế nào để enqueue một cách chính xác?
- 4. Làm thế nào để đọc các biến int chưa được gán từ tệp một cách chính xác, sử dụng ifstream?
- 5. Làm thế nào để phá vỡ một chuỗi trong dòng
- 6. Làm thế nào để sử dụng tăng :: error_info chính xác?
- 7. C# Làm thế nào để đọc và ghi từ dòng textbox đa dòng theo dòng?
- 8. làm thế nào tôi có thể đọc chính xác 128 byte từ một fstream vào một đối tượng chuỗi?
- 9. Làm thế nào để sử dụng chính xác SetWindowsHookEx & CallNextHookEx
- 10. Làm thế nào để xử lý một chuỗi lớn một cách chính xác?
- 11. Làm thế nào để getSystemService() hoạt động chính xác?
- 12. owl - protege không suy luận chính xác? làm thế nào để xác định chính xác một lớp học "ăn chay"?
- 13. Python làm thế nào để đọc và chia một dòng với một số nguyên
- 14. Làm cách nào để xác định chính xác cách viết hoa chính xác cho một từ?
- 15. Làm cách nào để sửa lỗi thụt dòng Javascript nội dòng không chính xác trong Vim?
- 16. Làm thế nào để xác định phụ thuộc appcompat v7 một cách chính xác?
- 17. Đọc một dòng tệp theo dòng
- 18. Làm thế nào để xóa ImageView chính xác?
- 19. Làm thế nào để đặt Silverlight CurrentUICulture/CurrentCulture chính xác?
- 20. Làm thế nào để mở rộng chính xác Devise Recoverable?
- 21. NDesk.Options: làm thế nào để đăng ký các thông số cần thiết một cách chính xác?
- 22. Làm thế nào để có được dòng đọc tập tin theo dòng
- 23. Làm cách nào để đọc một dòng tệp gzip theo dòng?
- 24. Làm thế nào chính xác dòng là nhận in trên "Bảng điều khiển" sử dụng System.out.print()
- 25. Làm thế nào để đọc một dòng dữ liệu csv trong Python?
- 26. Làm thế nào để đọc từng dòng từ một vùng văn bản
- 27. (PHP) Làm thế nào để thực hiện một cách chính xác crypt()
- 28. Làm thế nào để chia số chính xác gấp đôi nhỏ một cách chính xác mà không có lỗi chính xác?
- 29. twitter bootstrap - làm thế nào để bỏ qua một dòng?
- 30. Làm thế nào để parallelize một cách chính xác một lồng nhau cho vòng
Điều này thường đủ tốt, nhưng đôi khi tôi nhận được các dòng dài reaallly, và đọc một char tại một thời điểm quá chậm. –