Console.ReadLine Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Считывает следующую строку символов из стандартного входного потока.
public:
static System::String ^ ReadLine();
[System.Runtime.Versioning.UnsupportedOSPlatform("android")]
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static string? ReadLine();
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static string? ReadLine();
public static string ReadLine();
[<System.Runtime.Versioning.UnsupportedOSPlatform("android")>]
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member ReadLine : unit -> string
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member ReadLine : unit -> string
static member ReadLine : unit -> string
Public Shared Function ReadLine () As String
Возвращаемое значение
Следующая строка символов из входного потока или null если больше строк нет.
- Атрибуты
Исключения
Произошла ошибка ввода-вывода.
Недостаточно памяти для выделения буфера для возвращаемой строки.
Число символов в следующей строке символов больше, чем Int32.MaxValue.
Примеры
В следующем примере требуется два аргумента командной строки: имя существующего текстового файла и имя файла для записи выходных данных. Он открывает существующий текстовый файл и перенаправляет стандартные входные данные с клавиатуры в этот файл. Он также перенаправляет стандартные выходные данные из консоли в выходной файл. Затем он использует Console.ReadLine метод для чтения каждой строки в файле, заменяет каждую последовательность из четырех пробелов символом табуляции и использует Console.WriteLine метод для записи результата в выходной файл.
using System;
using System.IO;
public class InsertTabs
{
private const int tabSize = 4;
private const string usageText = "Usage: INSERTTABS inputfile.txt outputfile.txt";
public static int Main(string[] args)
{
if (args.Length < 2)
{
Console.WriteLine(usageText);
return 1;
}
try
{
// Attempt to open output file.
using (var writer = new StreamWriter(args[1]))
{
using (var reader = new StreamReader(args[0]))
{
// Redirect standard output from the console to the output file.
Console.SetOut(writer);
// Redirect standard input from the console to the input file.
Console.SetIn(reader);
string line;
while ((line = Console.ReadLine()) != null)
{
string newLine = line.Replace(("").PadRight(tabSize, ' '), "\t");
Console.WriteLine(newLine);
}
}
}
}
catch(IOException e)
{
TextWriter errorWriter = Console.Error;
errorWriter.WriteLine(e.Message);
errorWriter.WriteLine(usageText);
return 1;
}
// Recover the standard output stream so that a
// completion message can be displayed.
var standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
Console.WriteLine($"INSERTTABS has completed the processing of {args[0]}.");
return 0;
}
}
open System
open System.IO
let tabSize = 4
let usageText = "Usage: INSERTTABS inputfile.txt outputfile.txt"
[<EntryPoint>]
let main args =
if args.Length < 2 then
Console.WriteLine usageText
1
else
try
// Attempt to open output file.
use reader = new StreamReader(args[0])
use writer = new StreamWriter(args[1])
// Redirect standard output from the console to the output file.
Console.SetOut writer
// Redirect standard input from the console to the input file.
Console.SetIn reader
let mutable line = Console.ReadLine()
while line <> null do
let newLine = line.Replace(("").PadRight(tabSize, ' '), "\t")
Console.WriteLine newLine
line <- Console.ReadLine()
// Recover the standard output stream so that a
// completion message can be displayed.
let standardOutput = new StreamWriter(Console.OpenStandardOutput())
standardOutput.AutoFlush <- true
Console.SetOut standardOutput
Console.WriteLine $"INSERTTABS has completed the processing of {args[0]}."
0
with :? IOException as e ->
let errorWriter = Console.Error
errorWriter.WriteLine e.Message
errorWriter.WriteLine usageText
1
Imports System.IO
Public Module InsertTabs
Private Const tabSize As Integer = 4
Private Const usageText As String = "Usage: INSERTTABS inputfile.txt outputfile.txt"
Public Function Main(args As String()) As Integer
If args.Length < 2 Then
Console.WriteLine(usageText)
Return 1
End If
Try
' Attempt to open output file.
Using writer As New StreamWriter(args(1))
Using reader As New StreamReader(args(0))
' Redirect standard output from the console to the output file.
Console.SetOut(writer)
' Redirect standard input from the console to the input file.
Console.SetIn(reader)
Dim line As String = Console.ReadLine()
While line IsNot Nothing
Dim newLine As String = line.Replace("".PadRight(tabSize, " "c), ControlChars.Tab)
Console.WriteLine(newLine)
line = Console.ReadLine()
End While
End Using
End Using
Catch e As IOException
Dim errorWriter As TextWriter = Console.Error
errorWriter.WriteLine(e.Message)
errorWriter.WriteLine(usageText)
Return 1
End Try
' Recover the standard output stream so that a
' completion message can be displayed.
Dim standardOutput As New StreamWriter(Console.OpenStandardOutput())
standardOutput.AutoFlush = True
Console.SetOut(standardOutput)
Console.WriteLine($"INSERTTABS has completed the processing of {args(0)}.")
Return 0
End Function
End Module
Комментарии
Метод ReadLine считывает строку из стандартного входного потока. (Определение строки см. в абзаце после следующего списка.) Это означает, что:
Если стандартное устройство ввода является клавиатурой, ReadLine метод блокируется, пока пользователь не нажимает клавишу ВВОД .
Одним из наиболее распространенных способов ReadLine является приостановка выполнения программы перед очисткой консоли и отображением новых сведений в ней или запрос пользователя на нажатие клавиши ВВОД перед завершением приложения. Это показано в следующем примере.
using System; public class Example { public static void Main() { Console.Clear(); DateTime dat = DateTime.Now; Console.WriteLine("\nToday is {0:d} at {0:T}.", dat); Console.Write("\nPress any key to continue... "); Console.ReadLine(); } } // The example displays output like the following: // Today is 10/26/2015 at 12:22:22 PM. // // Press any key to continue...open System Console.Clear() let dat = DateTime.Now printfn $"\nToday is {dat:d} at {dat:T}." printf "\nPress any key to continue... " Console.ReadLine() |> ignore // The example displays output like the following: // Today is 12/28/2021 at 8:23:50 PM. // // Press any key to continue...Module Example Public Sub Main() Console.Clear() Dim dat As Date = Date.Now Console.WriteLine() Console.WriteLine("Today is {0:d} at {0:T}.", dat) Console.WriteLine() Console.Write("Press any key to continue... ") Console.ReadLine() End Sub End Module ' The example displays output like the following: ' Today is 10/26/2015 at 12:22:22 PM. ' ' Press any key to continue...Если стандартные входные данные перенаправляются в файл, ReadLine метод считывает строку текста из файла. Например, ниже приведен текстовый файл с именем ReadLine1.txt:
This is the first line. This is the second line. This is the third line. This is the fourth line.В следующем примере метод используется ReadLine для чтения входных данных, перенаправленных из файла. Операция чтения завершается, когда метод возвращает
nullзначение, указывающее, что строки не будут считываться.using System; public class Example { public static void Main() { if (!Console.IsInputRedirected) { Console.WriteLine("This example requires that input be redirected from a file."); return; } Console.WriteLine("About to call Console.ReadLine in a loop."); Console.WriteLine("----"); String s; int ctr = 0; do { ctr++; s = Console.ReadLine(); Console.WriteLine("Line {0}: {1}", ctr, s); } while (s != null); Console.WriteLine("---"); } } // The example displays the following output: // About to call Console.ReadLine in a loop. // ---- // Line 1: This is the first line. // Line 2: This is the second line. // Line 3: This is the third line. // Line 4: This is the fourth line. // Line 5: // ---open System if not Console.IsInputRedirected then printfn "This example requires that input be redirected from a file." printfn "About to call Console.ReadLine in a loop." printfn "----" let mutable s = "" let mutable i = 0 while s <> null do i <- i + 1 s <- Console.ReadLine() printfn $"Line {i}: {s}" printfn "---" // The example displays the following output: // About to call Console.ReadLine in a loop. // ---- // Line 1: This is the first line. // Line 2: This is the second line. // Line 3: This is the third line. // Line 4: This is the fourth line. // Line 5: // ---Module Example Public Sub Main() If Not Console.IsInputRedirected Then Console.WriteLine("This example requires that input be redirected from a file.") Exit Sub End If Console.WriteLine("About to call Console.ReadLine in a loop.") Console.WriteLine("----") Dim s As String Dim ctr As Integer Do ctr += 1 s = Console.ReadLine() Console.WriteLine("Line {0}: {1}", ctr, s) Loop While s IsNot Nothing Console.WriteLine("---") End Sub End Module ' The example displays the following output: ' About to call Console.ReadLine in a loop. ' ---- ' Line 1: This is the first line. ' Line 2: This is the second line. ' Line 3: This is the third line. ' Line 4: This is the fourth line. ' Line 5: ' ---После компиляции примера в исполняемый файл с именем ReadLine1.exeего можно запустить из командной строки, чтобы прочитать содержимое файла и отобразить их в консоли. Синтаксис:
ReadLine1 < ReadLine1.txt
Строка определяется как последовательность символов, за которой следует возвращать каретки (шестнадцатеричные 0x000d), веб-канал строки (шестнадцатеричные 0x000a) или значение Environment.NewLine свойства. Возвращаемая строка не содержит конечные символы. По умолчанию метод считывает входные данные из 256-символьного входного буфера. Так как это включает Environment.NewLine символы, метод может считывать строки, содержащие до 254 символов. Чтобы прочитать более длинные OpenStandardInput(Int32) строки, вызовите метод.
Метод ReadLine выполняется синхронно. То есть он блокирует, пока строка не будет прочитана или сочетание клавиш CTRL+Z (а затем ввод в Windows) нажимается. Свойство In возвращает TextReader объект, представляющий стандартный входной поток и имеющий синхронный TextReader.ReadLine метод и асинхронный TextReader.ReadLineAsync метод. Однако при использовании в качестве стандартного входного потока консоли выполняется синхронно, TextReader.ReadLineAsync а не асинхронно и возвращается Task<String> только после завершения операции чтения.
Если этот метод создает OutOfMemoryException исключение, позиция читателя в базовом Stream объекте расширена числом символов, которые метод смог прочитать, но символы, которые уже считываются во внутренний ReadLine буфер, удаляются. Так как положение средства чтения в потоке не может быть изменено, символы уже считываются неустранимы, и доступ к ней можно получить только путем повторного инициализации TextReader. Если начальная позиция в потоке неизвестна или поток не поддерживает поиск, базовый Stream элемент также необходимо повторно инициализировать. Чтобы избежать такой ситуации и создать надежный код, следует использовать KeyAvailable свойство и ReadKey метод и хранить символы чтения в предварительно выделенном буфере.
Если сочетание клавиш CTRL+Z (а затем ввод в Windows) нажимается, когда метод считывает входные данные из консоли, метод возвращается null. Это позволяет пользователю предотвратить дальнейшие ввод клавиатуры при ReadLine вызове метода в цикле. Следующий пример иллюстрирует этот сценарий.
using System;
public class Example
{
public static void Main()
{
string line;
Console.WriteLine("Enter one or more lines of text (press CTRL+Z to exit):");
Console.WriteLine();
do {
Console.Write(" ");
line = Console.ReadLine();
if (line != null)
Console.WriteLine(" " + line);
} while (line != null);
}
}
// The following displays possible output from this example:
// Enter one or more lines of text (press CTRL+Z to exit):
//
// This is line #1.
// This is line #1.
// This is line #2
// This is line #2
// ^Z
//
// >
open System
printfn "Enter one or more lines of text (press CTRL+Z to exit):\n"
let mutable line = ""
while line <> null do
printf " "
line <- Console.ReadLine()
if line <> null then
printfn $" {line}"
// The following displays possible output from this example:
// Enter one or more lines of text (press CTRL+Z to exit):
//
// This is line #1.
// This is line #1.
// This is line #2
// This is line #2
// ^Z
//
// >
Module Example
Public Sub Main()
Dim line As String
Console.WriteLine("Enter one or more lines of text (press CTRL+Z to exit):")
Console.WriteLine()
Do
Console.Write(" ")
line = Console.ReadLine()
If line IsNot Nothing Then Console.WriteLine(" " + line)
Loop While line IsNot Nothing
End Sub
End Module
' The following displays possible output from this example:
' Enter one or more lines of text (press CTRL+Z to exit):
'
' This is line #1.
' This is line #1.
' This is line #2
' This is line #2
' ^Z
'
' >