Bir Linux dosya tanıtıcım var (soketten) ve bir satır okumak istiyorum. C++'da nasıl yapılır?Tam olarak bir satır nasıl okunur?
cevap
yalancı kod: Böyle
char newline = '\n';
file fd;
initialize(fd);
string line;
char c;
while(newline != (c = readchar(fd))) {
line.append(c);
}
şey.
Hattın sonuna erişileceğinden emin olamayacağınız bir TCP soketinden okudum. Eğer ayırıcı olarak "\ n \ n" kullandığınız varsayarak
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;
: Therfore böyle bir şey gerekir. (Bu kod snippet'i test etmedim ;-))
UDP yuvasında, başka bir hikaye var. Emiter, bütün bir çizgi içeren bir saray gönderebilir. Alıcı, tek bir ünite olarak padayı almak için garantilidir. UDP, TCP gibi güvenilir olmadığından, bunu alırsa.
Bu TCP ile ilgili, evet. Sorun şu ki soket interaktif. Bir satır göndermeliyim, sonra birkaç satır var. Sonunu çift satırlı "\ n \ n" ile tanıyabilirim. –
... bu yüzden 1024 karakterini okuyamıyorum çünkü çok fazla olmayabilir. adam 2 oku, POSIX okumasının 3 argümanı olduğunu gösterir, bu yüzden ne okuduğunuzu bilmiyorum. –
size söylediğim gibi test etmedim. Sadece 'anında' yazarım. Kodun anlaşılması ve uyarlanması kolaydır. Bu arada, satır sınırlayıcılarınızı hesaba katmak için güncelledim: "\ n \ n" –
C++ prizler kütüphane kullanma:
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"); } } };
Ve yukarıdaki sınıfını kullanarak:
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; } }
kütüphane tüm hata işleme ilgilenir.
google kullanarak kütüphane bulun veya bu doğrudan bağlantıyı kullanın: Burada http://www.alhem.net/Sockets/
bir test edilir, oldukça verimli kodu: Ayrıca okumada görmezden ve yazma kurulum sinyal SIGPIPE yararlıdır
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;
}
(ve Yukarıda gösterildiği gibi hataları ele alalım):
signal (SIGPIPE, SIG_IGN);
- 1. UITextView'da satır sayısı nasıl okunur
- 2. Bir csv'den birkaç satır nasıl okunur?
- 3. Bit dosya ile tam dosya nasıl okunur
- 4. R, kullanıcı isteminden bir tam sayı nasıl okunur?
- 5. CD dosya olarak nasıl okunur?
- 6. Kullanıcı, cin kullanarak tam bir çizgi nasıl okunur?
- 7. Tam olarak tam olarak ne yapar? (...).
- 8. Belirli bir alanın değeri nasıl okunur Okunur
- 9. SQL: Tam olarak eşleşmeyen satırları bulun ancak tam olarak değil
- 10. Yeni satır göndermezse, sunucu tarafından gönderilen veri (xml) nasıl okunur?
- 11. Qt nasıl çalışır (tam olarak)?
- 12. JavaScript tam olarak nasıl yorumluyor?
- 13. Görevler tam olarak nasıl planlanır?
- 14. Tam olarak nasıl çalışır?() {}() Çalışır?
- 15. Tam olarak bir ViewModel nedir?
- 16. Tam olarak bir ROM nedir?
- 17. Her çalışan için sırasız alanı kriterler olarak tam olarak bir satır seçin
- 18. Sitecore'da "salt okunur" bir alanı nasıl yapabilirim?
- 19. Dataframe, bir satır adı olarak
- 20. Belleği salt okunur olarak gösterme
- 21. Firefox'u varsayılan olarak imleci salt okunur olarak nasıl geçersiz kılabilirim?
- 22. Bir dosyadan bitler nasıl okunur?
- 23. Ekrandan bir piksel nasıl okunur?
- 24. Seçme düğmesi olmadan GridView'da tam satır seçimi nasıl yapılır?
- 25. Tam olarak diskteki bir görüntüden bir CGImageRef yapmak nasıl
- 26. Tam olarak bir sysroot nedir ve nasıl bir tane oluştururum?
- 27. Jmeter dosyasındaki bir yanıtı tam olarak kaydetme
- 28. Tam olarak DEFAULT_COMPRESSION nedir?
- 29. Tam olarak ne kullanıyorum?
- 30. Java'da icy protokolü nasıl okunur?
Bu genellikle yeterince iyidir, ancak bazen uzunca satırlar alıyorum ve bir seferde bir karakter okuma çok yavaş. –