2009-10-17 24 views

cevap

2

yalancı kod: Böyle

char newline = '\n'; 
file fd; 
initialize(fd); 
string line; 
char c; 
while(newline != (c = readchar(fd))) { 
line.append(c); 
} 

şey.

+0

Bu genellikle yeterince iyidir, ancak bazen uzunca satırlar alıyorum ve bir seferde bir karakter okuma çok yavaş. –

3

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.

+0

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. –

+0

... 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. –

+0

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" –

0

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/

2

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); 
İlgili konular