Me gustaría leer la entrada estándar desde la línea de comando, pero mis intentos han terminado con la salida del programa antes de que se me solicite la entrada. Estoy buscando el equivalente de Console.ReadLine () en C #.
Esto es lo que tengo actualmente:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)
fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)
ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
bufio
almacenamiento en búfer de ningún lector (pbufio.NewReader(os.Stdin)
. Ej. ) Con lecturas directas del lector subyacente (p. Ej.,fmt.Scanln(x)
Lecturas directas deos.Stdin
). El almacenamiento en búfer puede leerse arbitrariamente más adelante (En este caso específico, lo último debería serfmt.Fscanln(reader,x)
leer desde el mismo búfer).fmt.Sscanln
trabajos, se convierte en "% v" después de ejecutarRespuestas:
No estoy seguro de qué le pasa al bloque
Como funciona en mi máquina. Sin embargo, para el siguiente bloque necesita un puntero a las variables a las que está asignando la entrada. Intenta reemplazar
fmt.Scanln(text2)
confmt.Scanln(&text2)
. No lo useSscanln
, porque analiza una cadena que ya está en memoria en lugar de stdin. Si desea hacer algo como lo que estaba tratando de hacer, reemplácelo confmt.Scanf("%s", &ln)
Si esto aún no funciona, su culpable podría ser una configuración extraña del sistema o un IDE con errores.
fuente
ReadString('\n')
oReadString("\n")
?rd
a la variables
comoif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
cannot use "\n" (type string) as type byte in argument to reader.ReadString
también puedes probar:
fuente
fmt.Println(scanner.Err())
debajo del bucle for.Creo que una forma más estándar de hacer esto sería:
Eche un vistazo al
scan
godoc: http://godoc.org/fmt#Scanfuente
stops scanning at a newline and after the final item there must be a newline or EOF
no estoy seguro de por qué el espacio lo "rompe" ... Supongo que es un errorfmt.Scanln
yfmt.Scan
con la versión actual de 2016 go (versión go go 1.6.6 linux / amd64).Siempre trate de usar el bufio.NewScanner para recopilar información de la consola. Como otros mencionaron, hay varias formas de hacer el trabajo, pero Scanner originalmente está destinado a hacer el trabajo. Dave Cheney explica por qué debería usar Scanner en lugar de bufio. ReadLine de Read.
https://twitter.com/davecheney/status/604837853344989184?lang=en
Aquí está la respuesta del fragmento de código para su pregunta
Si no desea recopilar las entradas mediante programación, simplemente agregue estas líneas
La salida del programa anterior será:
El programa anterior recopila la entrada del usuario y la guarda en una matriz. También podemos romper ese flujo con un carácter especial. Scanner proporciona API para uso avanzado como dividir usando una función personalizada, etc., escaneando diferentes tipos de flujos de E / S (Stdin, String), etc.
fuente
Otra forma de leer múltiples entradas dentro de un bucle que puede manejar una entrada con espacios:
Salida:
fuente
Llego tarde a la fiesta. Pero ¿qué tal un trazador de líneas:
y presione ctrl + d (EOT) una vez que se ingresa la entrada en la línea de comando.
fuente
os.Stdin
no 'termina' es imposible leerlo todo. Puede quemail
.Prueba este código: -
fuente
Scanf()
que no acepta espacios en blanco en cadenaTambién se puede hacer así:
fuente
Lea claramente en un par de valores solicitados:
Aquí hay una carrera:
fuente
Debe proporcionar un puntero a la var que desea escanear, así:
fuente
En mi caso, el programa no estaba esperando porque estaba usando el
watcher
comando para ejecutar automáticamente el programa. La ejecución manual del programago run main.go
dio como resultado "Introducir texto" y, finalmente, imprimir en la consola.fuente
Scan*
familia es que leen hasta un separador de espacios en blanco (por ejemplo, espacios).