Console.ReadLine Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Läser nästa rad med tecken från standardindataströmmen.
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
Returer
Nästa rad med tecken från indataströmmen, eller null om inga fler rader är tillgängliga.
- Attribut
Undantag
Ett I/O-fel uppstod.
Det finns inte tillräckligt med minne för att allokera en buffert för den returnerade strängen.
Antalet tecken på nästa rad med tecken är större än Int32.MaxValue.
Exempel
I följande exempel krävs två kommandoradsargument: namnet på en befintlig textfil och namnet på en fil som utdata ska skrivas till. Den öppnar den befintliga textfilen och omdirigerar standardindata från tangentbordet till filen. Den omdirigerar också standardutdata från konsolen till utdatafilen. Den använder Console.ReadLine sedan metoden för att läsa varje rad i filen, ersätter varje sekvens med fyra blanksteg med ett fliktecken och använder Console.WriteLine metoden för att skriva resultatet till utdatafilen.
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
Kommentarer
Metoden ReadLine läser en rad från standardindataströmmen. (För definitionen av en rad, se stycket efter följande lista.) Det innebär att:
Om standardindataenheten är tangentbordet ReadLine blockeras metoden tills användaren trycker på Retur-tangenten .
En av de vanligaste användningsområdena ReadLine för metoden är att pausa programkörningen innan konsolen rensas och ny information visas för den, eller att uppmana användaren att trycka på Retur innan programmet avslutas. I följande exempel visas detta.
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...Om standardindata omdirigeras till en fil ReadLine läser metoden en textrad från en fil. Följande är till exempel en textfil med namnet ReadLine1.txt:
This is the first line. This is the second line. This is the third line. This is the fourth line.I följande exempel används ReadLine metoden för att läsa indata som omdirigeras från en fil. Läsåtgärden avslutas när metoden returnerar
null, vilket indikerar att inga rader återstår att läsa.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: ' ---När du har sammanställt exemplet till en körbar fil med namnet ReadLine1.exekan du köra det från kommandoraden för att läsa innehållet i filen och visa dem i konsolen. Syntaxen är:
ReadLine1 < ReadLine1.txt
En rad definieras som en sekvens med tecken följt av en vagnretur (hexadecimal 0x000d), en radfeed (hexadecimal 0x000a) eller värdet för Environment.NewLine egenskapen. Den returnerade strängen innehåller inte avslutande tecken. Som standard läser metoden indata från en indatabuffert på 256 tecken. Eftersom detta inkluderar Environment.NewLine tecknen kan metoden läsa rader som innehåller upp till 254 tecken. Om du vill läsa längre rader anropar du OpenStandardInput(Int32) metoden.
Metoden ReadLine körs synkront. Den blockerar alltså tills en rad läses eller tangentbordskombinationen Ctrl+Z tangentbord (följt av Enter på Windows). Egenskapen In returnerar ett TextReader objekt som representerar standardindataströmmen och som har både en synkron TextReader.ReadLine metod och en asynkron TextReader.ReadLineAsync metod. Men när den används som konsolens standardindataström körs den TextReader.ReadLineAsync synkront i stället för asynkront och returnerar endast när Task<String> läsåtgärden har slutförts.
Om den här metoden utlöser ett OutOfMemoryException undantag avanceras läsarens position i det underliggande Stream objektet av antalet tecken som metoden kunde läsa, men tecknen som redan lästs in i den interna ReadLine bufferten ignoreras. Eftersom det inte går att ändra läsarens position i dataströmmen går det inte att återställa de tecken som redan lästs och kan endast nås genom att initiera om TextReader. Om den inledande positionen i dataströmmen är okänd eller om strömmen inte stöder sökning, måste den underliggande Stream också initieras igen. För att undvika en sådan situation och skapa robust kod bör du använda KeyAvailable egenskapen och ReadKey metoden och lagra lästecken i en förallokerad buffert.
Om tangentkombinationen Ctrl+Z (följt av Enter på Windows) trycks ned när metoden läser indata från konsolen, returnerar metoden null. På så sätt kan användaren förhindra ytterligare tangentbordsindata när ReadLine metoden anropas i en loop. I följande exempel illustreras scenariot.
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
'
' >