मैं एक .NET कोर कंसोल एप्लिकेशन लिख रहा हूं। मैं प्रत्येक इनपुट के लिए अधिकतम वर्णों की एक निश्चित संख्या में कंसोल इनपुट को सीमित करना चाहता था। मेरे पास कुछ कोड है जो Console.ReadLine()
के बजाय Console.ReadKey()
के साथ एक स्ट्रिंग बनाकर ऐसा करता है सबकुछ विंडोज पर पूरी तरह से परीक्षण करता है। फिर, जब मैंने रास्पबेरी पाई 3 को रास्पियन चलाने के लिए तैनात किया, तो मुझे जल्दी ही सभी प्रकार की समस्याओं का सामना करना पड़ा। मुझे याद आया कि लिनक्स विंडोज़ से अलग-अलग लाइन अंतराल को संभालता है, और ऐसा लगता है कि बैकस्पेस को अलग-अलग संभाला जाता है। मैंने उन तरीकों को बदल दिया जिन्हें मैंने चरित्र के बजाए कंसोलकी से बाहर कर दिया, और नई लाइन समस्या दूर हो गई, लेकिन बैकस्पेस केवल कभी-कभी पंजीकरण करते थे। साथ ही, कभी-कभी वर्ण मेरे इनपुट बॉक्स के बाहर कंसोल पर आउटपुट हो जाते हैं, भले ही मैंने रीडकी को कंसोल पर आउटपुट न करने के लिए सेट किया हो। क्या मैं कुछ याद कर रहा हूं कि लिनक्स कंसोल इनपुट कैसे संभालता है?राइटबियन पर .NET कोर हैंडलिंग रीडकी अलग-अलग क्यों है?
//I replaced my calls to Console.ReadLine() with this. The limit is the
//max number of characters that can be entered in the console.
public static string ReadChars(int limit)
{
string str = string.Empty; //all the input so far
int left = Console.CursorLeft; //store cursor position for re-outputting
int top = Console.CursorTop;
while (true) //keep checking for key events
{
if (Console.KeyAvailable)
{
//true to intercept input and not output to console
//normally. This sometimes fails and outputs anyway.
ConsoleKeyInfo c = Console.ReadKey(true);
if (c.Key == ConsoleKey.Enter) //stop input on Enter key
break;
if (c.Key == ConsoleKey.Backspace) //remove last char on Backspace
{
if (str != "")
{
tr = str.Substring(0, str.Length - 1);
}
}
else if (c.Key != ConsoleKey.Tab && str.Length < limit)
{
//don't allow tabs or exceeding the max size
str += c.KeyChar;
}
else
{
//ignore tabs and when the limit is exceeded
continue;
}
Console.SetCursorPosition(left, top);
string padding = ""; //padding clears unused chars in field
for (int i = 0; i < limit - str.Length; i++)
{
padding += " ";
}
//output this way instead
Console.Write(str + padding);
}
}
return str;
}
यह * टर्मिनल * है जो कीस्ट्रोक को संभालता है। आपको कोई भी कुंजीस्ट्रोक नहीं मिलेगा जो आपके आवेदन पर पहले स्थान पर नहीं भेजे जाते हैं। न्यूलाइन के पास इसके साथ कुछ लेना देना नहीं है। .NET (और कोर) ऑपरेटिंग सिस्टम की सेटिंग्स का उपयोग करेगा। इसके अलावा, यह पहले से ही विंडोज़ –
में एक नई लाइन के रूप में '\ n' को पहचानता है, विंडोज़ कैरिज रिटर्न कैरेक्टर, \ r' को पहचानता है, जबकि लिनक्स केवल न्यूलाइन अक्षरों का उपयोग करता है, \ n'। मैं मूल रूप से '\ r' की जांच कर रहा था, जिसने निश्चित रूप से समस्याओं का सामना किया। मैं यह पता लगाने की कोशिश कर रहा था कि क्या ऐसे अन्य मतभेद थे जिनके लिए मैं लेखांकन नहीं कर रहा हूं। मैंने सोचा कि यह निहित था कि टर्मिनल कीस्ट्रोक को कैसे नियंत्रित करता है इसमें अंतर के साथ यह होना चाहिए। मेरा मुद्दा यह था कि रीडकी को अलग-अलग मशीनों पर अलग-अलग परिणाम मिलते हैं, भले ही मैं सटीक एक ही कीस्ट्रोक करता हूं, इस बात पर शक नहीं कि अलग-अलग सिस्टम उन कीस्ट्रोक को कैसे संसाधित करते हैं। – tyjkenn
इतना सुनिश्चित नहीं है कि इनमें से कोई भी समझ में आता है। लिनक्स पर आप अभी भी एंटर कुंजी दबाते हैं, आप \ n प्राप्त करने के लिए Ctrl + J दबाएं नहीं। ReadKey आपको दबाए गए कुंजी के बारे में बताता है, न कि यह कौन सा चरित्र पैदा करता है। तो जब तक आप कुंजी का उपयोग करते हैं और KeyChar नहीं तो तब तक कोई समस्या नहीं होनी चाहिए। हो सकता है कि आपने एक संगतता समस्या का खुलासा किया, यह सब बिल्कुल नया है इसलिए यह असंभव नहीं है। और वे दस अलग-अलग लिनक्स स्वादों का समर्थन करते हैं और रास्पियन उनमें से एक नहीं है। इसके बारे में बताने के लिए सर्वश्रेष्ठ, [नया अंक बटन] (https://github.com/dotnet/coreclr/issues) का उपयोग करें। –