मुझे this question मिला जो पूछता है कि इनपुट को असीमित रूप से कैसे पढ़ा जाए, लेकिन केवल POSIX स्ट्रीम डिस्क्रिप्टर के साथ काम करेगा, जो विंडोज पर काम नहीं करेगा। इसलिए, मुझे this tutorial मिला जो दिखाता है कि एक POSIX स्ट्रीम डिस्क्रिप्टर का उपयोग करने के बजाय मैं boost::asio::windows::stream_handle
का उपयोग कर सकता हूं।विंडोज में बूस्ट एएसओ का उपयोग करके कमांड लाइन से इनपुट को अतुल्यकालिक रूप से कैसे पढ़ा जाए?
दोनों उदाहरणों के बाद मैं नीचे दिए गए कोड के साथ आया था। जब मैं इसे चलाता हूं, तो मैं कमांड प्रॉम्प्ट में कुछ भी टाइप नहीं कर सकता, क्योंकि कार्यक्रम तुरंत समाप्त हो जाता है। मैं इसे उपयोगकर्ता से किसी भी इनपुट को कैप्चर करना चाहता हूं, संभवतः std::string
में, जबकि मेरे प्रोग्राम के भीतर अन्य तर्क निष्पादित करने की अनुमति देता है (यानी विंडोज कंसोल से एसिंक्रोनस I/O निष्पादित करता है)।
अनिवार्य रूप से, मैं stdin
से पढ़ने का प्रयास करते समय अपने प्रोग्राम को अवरुद्ध करने से बचने की कोशिश कर रहा हूं। मुझे नहीं पता कि यह विंडोज़ में संभव है, क्योंकि मुझे this post भी मिला है, जो विवरण एक ही चीज करने की कोशिश करते समय किसी अन्य उपयोगकर्ता को सामना करने में समस्या का सामना करता है।
#define _WIN32_WINNT 0x0501
#define INPUT_BUFFER_LENGTH 512
#include <cstdio>
#include <iostream>
#define BOOST_THREAD_USE_LIB // For MinGW 4.5 - (https://svn.boost.org/trac/boost/ticket/4878)
#include <boost/bind.hpp>
#include <boost/asio.hpp>
class Example {
public:
Example(boost::asio::io_service& io_service)
: input_buffer(INPUT_BUFFER_LENGTH), input_handle(io_service)
{
// Read a line of input.
boost::asio::async_read_until(input_handle, input_buffer, "\r\n",
boost::bind(&Example::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_read(const boost::system::error_code& error, std::size_t length);
void handle_write(const boost::system::error_code& error);
private:
boost::asio::streambuf input_buffer;
boost::asio::windows::stream_handle input_handle;
};
void Example::handle_read(const boost::system::error_code& error, std::size_t length)
{
if (!error)
{
// Remove newline from input.
input_buffer.consume(1);
input_buffer.commit(length - 1);
std::istream is(&input_buffer);
std::string s;
is >> s;
std::cout << s << std::endl;
boost::asio::async_read_until(input_handle, input_buffer, "\r\n",
boost::bind(&Example::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else if(error == boost::asio::error::not_found)
{
std::cout << "Did not receive ending character!" << std::endl;
}
}
void Example::handle_write(const boost::system::error_code& error)
{
if (!error)
{
// Read a line of input.
boost::asio::async_read_until(input_handle, input_buffer, "\r\n",
boost::bind(&Example::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
int main(int argc, char ** argv)
{
try {
boost::asio::io_service io_service;
Example obj(io_service);
io_service.run();
} catch(std::exception & e)
{
std::cout << e.what() << std::endl;
}
std::cout << "Program has ended" << std::endl;
getchar();
return 0;
}
मैं विंडोज उपयोगकर्ता नहीं हूं, लेकिन क्या यह \ r \ n को एक नई लाइन सूचक के रूप में उपयोग नहीं करता है? –
हां, लेकिन क्या यह इसे काम करने से रोक देगा, क्योंकि \ n अभी भी न्यूलाइन अनुक्रम में है? मैंने डेलीमीटर स्ट्रिंग को "\ r \ n" में बदल दिया, वही परिणाम। – nickb
जहां io_service :: run() का आह्वान करते हैं? –