2009-10-17 22 views

उत्तर

2

स्यूडोकोड:

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

कुछ ऐसे ही।

+0

यह आमतौर पर काफी अच्छा होता है, लेकिन कभी-कभी मुझे फिर से लंबी लाइनें मिलती हैं, और एक समय में एक char पढ़ना बहुत धीमा होता है। –

3

मैं आप एक टीसीपी सॉकेट से पढ़ रहे हैं, जिसे आप लाइन के अंत तक पहुंचने पर नहीं मान सकते हैं। Therfore आप ऐसा ही कुछ की आवश्यकता होगी:

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; 

मान लिया जाये कि आप उपयोग कर रहे परिसीमक के रूप में "\ n \ n"। (मैंने उस कोड स्निपेट का परीक्षण नहीं किया ;-))

एक यूडीपी सॉकेट पर, यह एक और कहानी है। उत्सर्जन एक पूरी लाइन युक्त एक पैकेट भेज सकता है। रिसीवर को एक इकाई के रूप में पैकेट प्राप्त करने के लिए गारंटी दी जाती है .. अगर इसे प्राप्त होता है, क्योंकि यूडीपी निश्चित रूप से टीसीपी के रूप में विश्वसनीय नहीं है।

+0

यह टीसीपी के बारे में है, हां। समस्या यह है कि सॉकेट इंटरैक्टिव है। मुझे एक लाइन भेजनी है, तो मुझे कुछ पंक्तियां मिलती हैं। मैं डबल न्यूलाइन "\ n \ n" के साथ अंत को पहचान सकता हूं। –

+0

... इसलिए मैं 1024 वर्णों को आगे नहीं पढ़ सकता क्योंकि बहुत से लोग नहीं हो सकते हैं। मैन 2 पढ़ता है कि पॉज़िक्स पढ़ने के 3 तर्क हैं, इसलिए मुझे नहीं पता कि आप किस संदर्भ का जिक्र कर रहे हैं। –

+0

जैसा कि मैंने आपको बताया था मैंने इसका परीक्षण नहीं किया था। मैं केवल 'फ्लाई पर' लिखता हूं। कोड को समझना और अनुकूलित करना आसान है। जिस तरह से मैंने इसे आपके लाइन डिलीमीटरों को ध्यान में रखकर अपडेट किया है: "\ n \ n" –

0

सी ++ सॉकेट पुस्तकालय का उपयोग करना:

 
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"); 
    } 
    } 
}; 

और इसके बाद के संस्करण का उपयोग कर वर्ग:

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; 
    } 
} 

पुस्तकालय सभी त्रुटि हैंडलिंग का ख्याल रखता है।

गूगल का उपयोग करते हुए पुस्तकालय का पता लगाएं या इस सीधा लिंक का उपयोग करें: http://www.alhem.net/Sockets/

2

यहाँ एक परीक्षण किया जाता है, काफी कुशल कोड:

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; 
} 

यह भी पढ़ने में अनदेखी और लेखन सेटअप संकेत SIGPIPE करने के लिए उपयोगी है (और ऊपर दिखाए गए त्रुटियों को संभाल लें):

signal (SIGPIPE, SIG_IGN); 
संबंधित मुद्दे