Console.ReadLine Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Odczytuje następny wiersz znaków ze standardowego strumienia wejściowego.
public:
static System::String ^ ReadLine();
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static string? ReadLine ();
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
[System.Runtime.Versioning.UnsupportedOSPlatform("android")]
public static string? ReadLine ();
public static string ReadLine ();
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member ReadLine : unit -> string
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
[<System.Runtime.Versioning.UnsupportedOSPlatform("android")>]
static member ReadLine : unit -> string
static member ReadLine : unit -> string
Public Shared Function ReadLine () As String
Zwraca
Następny wiersz znaków ze strumienia wejściowego lub null
jeśli nie są dostępne żadne wiersze.
- Atrybuty
Wyjątki
Wystąpił błąd we/wy.
Za mało pamięci, aby przydzielić bufor dla zwracanego ciągu.
Liczba znaków w następnym wierszu znaków jest większa niż Int32.MaxValue.
Przykłady
Poniższy przykład wymaga dwóch argumentów wiersza polecenia: nazwy istniejącego pliku tekstowego i nazwy pliku do zapisania danych wyjściowych. Spowoduje to otwarcie istniejącego pliku tekstowego i przekierowanie standardowych danych wejściowych z klawiatury do tego pliku. Przekierowuje również standardowe dane wyjściowe z konsoli do pliku wyjściowego. Następnie używa Console.ReadLine metody do odczytu każdego wiersza w pliku, zastępuje każdą sekwencję czterech spacji znakiem tabulacji i używa Console.WriteLine metody do zapisania wyniku do pliku wyjściowego.
using namespace System;
using namespace System::IO;
int main()
{
array<String^>^args = Environment::GetCommandLineArgs();
const int tabSize = 4;
String^ usageText = "Usage: INSERTTABS inputfile.txt outputfile.txt";
StreamWriter^ writer = nullptr;
if ( args->Length < 3 )
{
Console::WriteLine( usageText );
return 1;
}
try
{
// Attempt to open output file.
writer = gcnew StreamWriter( args[ 2 ] );
// 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( gcnew StreamReader( args[ 1 ] ) );
}
catch ( IOException^ e )
{
TextWriter^ errorWriter = Console::Error;
errorWriter->WriteLine( e->Message );
errorWriter->WriteLine( usageText );
return 1;
}
String^ line;
while ( (line = Console::ReadLine()) != nullptr )
{
String^ newLine = line->Replace( ((String^)"")->PadRight( tabSize, ' ' ), "\t" );
Console::WriteLine( newLine );
}
writer->Close();
// Recover the standard output stream so that a
// completion message can be displayed.
StreamWriter^ standardOutput = gcnew StreamWriter( Console::OpenStandardOutput() );
standardOutput->AutoFlush = true;
Console::SetOut( standardOutput );
Console::WriteLine( "INSERTTABS has completed the processing of {0}.", args[ 1 ] );
return 0;
}
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
Uwagi
Metoda ReadLine odczytuje wiersz ze standardowego strumienia wejściowego. (Aby uzyskać definicję wiersza, zobacz akapit po poniższej liście). Oznacza to, że:
Jeśli standardowe urządzenie wejściowe jest klawiaturą, ReadLine metoda blokuje, dopóki użytkownik nie naciśnie klawisz Enter .
Jednym z najpopularniejszych ReadLine zastosowań metody jest wstrzymywanie wykonywania programu przed wyczyszczeniem konsoli i wyświetleniem nowych informacji lub wyświetleniem monitu użytkownika o naciśnięcie klawisza Enter przed zakończeniem aplikacji. Ilustruje to poniższy przykład.
using namespace System; 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...
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...
Jeśli standardowe dane wejściowe są przekierowywane do pliku, ReadLine metoda odczytuje wiersz tekstu z pliku. Na przykład poniżej znajduje się plik tekstowy o nazwie ReadLine1.txt:
This is the first line. This is the second line. This is the third line. This is the fourth line.
W poniższym przykładzie użyto ReadLine metody do odczytu danych wejściowych przekierowanych z pliku. Operacja odczytu kończy się, gdy metoda zwraca
null
wartość , co oznacza, że żadne wiersze nie pozostają do odczytania.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: ' ---
Po skompilowaniu przykładu do pliku wykonywalnego o nazwie ReadLine1.exe możesz uruchomić go z poziomu wiersza polecenia, aby odczytać zawartość pliku i wyświetlić je w konsoli. Składnia jest następująca:
ReadLine1 < ReadLine1.txt
Linia jest definiowana jako sekwencja znaków, po której następuje znak powrotu karetki (0x000d szesnastkowa), szesnastkowe 0x000a wiersza lub wartość Environment.NewLine właściwości. Zwrócony ciąg nie zawiera znaków zakończenia. Domyślnie metoda odczytuje dane wejściowe z bufora wejściowego 256 znaków. Ponieważ obejmuje Environment.NewLine to znaki, metoda może odczytywać wiersze zawierające maksymalnie 254 znaki. Aby odczytać dłuższe wiersze, wywołaj metodę OpenStandardInput(Int32) .
Metoda ReadLine jest wykonywana synchronicznie. Oznacza to, że blokuje, dopóki wiersz nie zostanie odczytany lub kombinacja klawiatury Ctrl+Z (po której następuje klawisz Enter w systemie Windows), zostanie naciśnięta. Właściwość In zwraca TextReader obiekt reprezentujący standardowy strumień wejściowy, który ma zarówno metodę synchroniczną TextReader.ReadLine , jak i metodę asynchroniczną TextReader.ReadLineAsync . Jednak w przypadku użycia jako standardowego strumienia wejściowego konsoli program wykonuje synchronicznie, TextReader.ReadLineAsync a nie asynchronicznie i zwraca Task<String>
wartość tylko po zakończeniu operacji odczytu.
Jeśli ta metoda zgłasza OutOfMemoryException wyjątek, pozycja czytelnika w obiekcie bazowym Stream jest zaawansowana przez liczbę znaków, które metoda mogła odczytać, ale znaki już odczytane do buforu wewnętrznego ReadLine są odrzucane. Ponieważ nie można zmienić położenia czytnika w strumieniu, znaki już odczytane są nieodwracalne i mogą być dostępne tylko przez ponowne inicjowanie elementu TextReader. Jeśli pozycja początkowa w strumieniu jest nieznana lub strumień nie obsługuje wyszukiwania, należy również ponownie zainicjować bazowe Stream . Aby uniknąć takiej sytuacji i utworzyć niezawodny kod, należy użyć KeyAvailable właściwości i ReadKey metody i zapisać znaki odczytu w buforze wstępnie przydzielonym.
Jeśli kombinacja klawiszy Ctrl+Z (po której następuje klawisz Enter w systemie Windows) jest naciśnięta, gdy metoda odczytuje dane wejściowe z konsoli, metoda zwraca wartość null
. Dzięki temu użytkownik może zapobiec dalszym wprowadzaniem za pomocą klawiatury, gdy ReadLine metoda jest wywoływana w pętli. Poniższy przykład ilustruje ten scenariusz.
using namespace System;
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 != nullptr)
Console::WriteLine(" " + line);
} while (line != nullptr);
}
// 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
//
// >}
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
'
' >