কনসোলে স্ট্যান্ডার্ড ইনপুট থেকে কীভাবে পড়বেন?


270

আমি কমান্ড লাইন থেকে স্ট্যান্ডার্ড ইনপুটটি পড়তে চাই, তবে আমার চেষ্টাগুলি ইনপুট দেওয়ার জন্য অনুরোধ করার আগেই প্রোগ্রামটি প্রস্থানের সাথে শেষ হয়েছিল। আমি সি # তে কনসোলের সমতুল্য খুঁজছি e রিডলাইন ()

আমার কাছে বর্তমানে এটি রয়েছে:

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)
}

এই কোডটি সঠিক দেখাচ্ছে। কৌতূহলের বাইরে, আপনি কি খেলার মাঠে এটি চালাচ্ছেন? নেটওয়ার্কিং কারণে গোল প্লেগ্রাউন্ড স্টিডিন ইনপুটটিকে অনুমতি দেয় না।
লিনিয়ারজয়েত্রোপ

কিছুই নয়, এটি একটি সূক্ষ্ম ইস্যু বলে মনে হচ্ছে যেখানে আপনার পয়েন্টারের দরকার ছিল (আমার উত্তর দেখুন)। যদিও আমি নিশ্চিত নই যে বুফিও.নিউইরডার পদ্ধতিটি আমার পক্ষে কাজ করার কারণে সমস্যাটি কী।
লিনিয়ারজয়েট্রোপ


8
bufioকোনও পাঠকের বাফারিং মিশ্রণ করবেন না (উদাহরণস্বরূপ bufio.NewReader(os.Stdin)) আন্ডারলাইনিং পাঠকের fmt.Scanln(x)সরাসরি পাঠ্যের সাথে (যেমন সরাসরি পাঠানো থেকে os.Stdin) বাফারিং যথেচ্ছভাবে পড়তে পারে অনেক এগিয়ে। (এই নির্দিষ্ট ক্ষেত্রে পরে fmt.Fscanln(reader,x)একই বাফারটি পড়তে হবে )।
ডেভ সি

আমি fmt.Sscanlnকাজ পাই না , এটি দৌড়ানোর পরে "% v" হয়ে যায়
বীণো টুং

উত্তর:


294

আমি নিশ্চিত না যে ব্লকটিতে কী হয়েছে

reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

এটি আমার মেশিনে যেমন কাজ করে। যাইহোক, পরবর্তী ব্লকের জন্য আপনার ইনপুটটি নির্ধারণ করছেন এমন ভেরিয়েবলগুলির জন্য একটি পয়েন্টার প্রয়োজন। এর fmt.Scanln(text2)সাথে প্রতিস্থাপনের চেষ্টা করুন fmt.Scanln(&text2)। ব্যবহার করবেন না Sscanln, কারণ এটি স্টিডিনের পরিবর্তে মেমরিতে ইতিমধ্যে একটি স্ট্রিংকে পার্স করে। আপনি যা করার চেষ্টা করছেন তার মতো কিছু করতে চাইলে এটিকে প্রতিস্থাপন করুনfmt.Scanf("%s", &ln)

যদি এটি এখনও কাজ না করে, আপনার অপরাধী কিছু অদ্ভুত সিস্টেম সেটিংস বা বগী আইডিই হতে পারে।


2
সেগুলি কি একক কোট হওয়ার কথা? ReadString('\n')বা ReadString("\n")?
425nesp

8
@ ৪২৫ স্পেন হ্যাঁ, এটিই ডিলিমিটার, যা একক বাইট। golang.org/pkg/bufio/#Reader.ReadString
লিনিয়ারজয়েট্রোপ

3
ভাল উত্তর, তবে ব্যাকস্পেস ইত্যাদি কী ব্যবহার করার চেষ্টা করার পরে এটি ব্যর্থ হয়
কুমারহর্ষস

4
গোলং ফাইলটির মাধ্যমে পাঠক হিসাবে rdপরিবর্তনশীল sহিসাবে একটি লাইন পড়ার পক্ষেif s,_ = rd.ReadString('\n'); true { s = strings.Trim(s, " \n") }
নাম জি ভিইউ

2
কেবল একটি আকর্ষণীয় জিনিস ভাগ করে নেওয়া (আমি একজন গোলং শিক্ষানবিশ): single n অবশ্যই একক উদ্ধৃতিতে থাকতে হবে (ডাবল উদ্ধৃতি ব্যবহার করার চেষ্টা করবেন না)। অন্যথায়, এটি এটি পুনরুত্পাদন করবে:cannot use "\n" (type string) as type byte in argument to reader.ReadString
ivanleoncz

124

আপনি পাশাপাশি চেষ্টা করতে পারেন:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if scanner.Err() != nil {
    // handle error.
}

6
আপনি যদি কেবল একটিটির জন্য একটি লাইন ইনপুট চান তবে আপনি "for}" অপসারণ করতে পারেন।
ব্যবহারকারী2707671

3
যদি {} লুপের জন্য থাকে তবে প্রবেশ করার সাথে সাথে কীভাবে লুপ থেকে বেরিয়ে আসবেন? লুপ থামার জন্য এমন কোনও বিশেষ চরিত্র আছে যা? - ধন্যবাদ
মাধন গণেশ

2
@ মাধন স্ক্যানার.স্ক্যান () লুপের জন্য প্রস্থান করানো বা না চিহ্নিত করার জন্য মূল্য মূল্য প্রদান করে।
হেলিন ওয়াং

5
আপনি এই ত্রুটি বুফিও পাবেন can স্ক্যানার: টোকেন খুব দীর্ঘ যদি আপনার ইনপুটটি 64 * 1024 বাইটের চেয়ে বড় হয়। fmt.Println(scanner.Err())লুপ জন্য নীচে যোগ ভুলবেন না ।
যুবরাজ লোগানাথন

আমি যদি "abc \ n ^ D" লিখি, প্রত্যাশিত স্ট্রিংটি "abc \ n" তবে এটি "abc" ফেরত দেয় What
শ্বেন্দ্র মিশ্র

96

আমি মনে করি এটি করার আরও একটি স্ট্যান্ডার্ড উপায় হ'ল:

package main

import "fmt"

func main() {
    fmt.Print("Enter text: ")
    var input string
    fmt.Scanln(&input)
    fmt.Print(input)
}

কটাক্ষপাত scangodoc: http://godoc.org/fmt#Scan

স্ক্যান করে পাঠ্য স্ক্যান করে স্ট্যান্ডার্ড ইনপুট থেকে পাঠানো, ক্রমান্বয়ে স্থান-বিভাজিত মানগুলি ক্রমাগত আর্গুমেন্টে সঞ্চয় করে। নিউলাইনগুলি স্থান হিসাবে গণনা করে।

স্ক্যানল্যান স্ক্যানের অনুরূপ, তবে একটি নতুন লাইনে স্ক্যান করা বন্ধ করে দেয় এবং চূড়ান্ত আইটেমের পরে অবশ্যই একটি নতুন লাইন বা ইওএফ থাকতে হবে।


10
এটি ইনপুট স্ট্রিংয়ের ফাঁকা স্থান পছন্দ করবে বলে মনে হচ্ছে না।
হিরি ক্রিস

3
পছন্দ করেছেন ডকটিতে এটি বলেছে যে stops scanning at a newline and after the final item there must be a newline or EOFস্থানটি এটি "ব্রেক" কেন তাই নিশ্চিত নয় ... আমার ধারণা এটি একটি বাগ
কারানতান

6
এর জন্য একটি ত্রুটি খোলা হয়েছিল: github.com/golang/go/issues/5703 এটি ওয়ার্কিংএএসআইন্ডেন্ডেড হিসাবে বন্ধ হয়ে গেছে। আরও দেখুন: stackoverflow.com/questions/24005899/... এবং groups.google.com/forum/#!topic/golang-nuts/r6Jl4D9Juw0 মনে মানুষ অনেক এই সঙ্গে বিষয় আছে। ডকুমেন্টেশন পরিবর্তন প্রয়োজন? এছাড়াও, এই শেষ লিঙ্কটি থেকে: "স্ক্যান এবং স্ক্যানলান পার্সিং এবং এর মতো স্টাফের জন্য, সুতরাং স্টিডিনের কাছ থেকে কেবল একটি একক পাঠ্য লেখাই উদ্দেশ্যকে পরাস্ত করবে।"
ব্যবহারকারী2707671

আমার কাছে, এটি সত্যই বিভ্রান্তিকর যে fmt.Scan এর অনুরূপ কোনও কার্যক্রমে বুফিও.নিউইডার এর মতো স্পেসগুলির সাথে ভাল খেলতে পারে না।
ফিলবট 3

3
বর্তমান 2016 গো সংস্করণটি ব্যবহার করার সময় fmt.Scanlnএবং fmt.Scan(Go সংস্করণ go1.6.2 লিনাক্স / এএমডি 64) স্পেসগুলির সাথে একই সমস্যা রয়ে গেছে ।
চিহেব নেক্সাস

30

কনসোল থেকে ইনপুট সংগ্রহের জন্য সর্বদা বুফিও.ইউউস্ক্যানার ব্যবহার করার চেষ্টা করুন। অন্যরা যেমন উল্লেখ করেছে, কাজ করার একাধিক উপায় রয়েছে তবে স্ক্যানার মূলত কাজটি করার উদ্দেশ্যে তৈরি। ডেভ চেনি ব্যাখ্যা করেছেন যে আপনাকে বুফিও-র পরিবর্তে স্ক্যানার কেন ব্যবহার করা উচিত e রিডারের রিডলাইন।

https://twitter.com/davecheney/status/604837853344989184?lang=en

আপনার প্রশ্নের জন্য কোড স্নিপেট উত্তর এখানে

package main

import (
    "bufio"
    "fmt"
    "os"
)

/*
 Three ways of taking input
   1. fmt.Scanln(&input)
   2. reader.ReadString()
   3. scanner.Scan()

   Here we recommend using bufio.NewScanner
*/

func main() {
    // To create dynamic array
    arr := make([]string, 0)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Enter Text: ")
        // Scans a line from Stdin(Console)
        scanner.Scan()
        // Holds the string that scanned
        text := scanner.Text()
        if len(text) != 0 {
            fmt.Println(text)
            arr = append(arr, text)
        } else {
            break
        }

    }
    // Use collected inputs
    fmt.Println(arr)
}

আপনি যদি প্রোগ্রামগতভাবে ইনপুট সংগ্রহ করতে না চান তবে এই লাইনগুলি যুক্ত করুন

   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   text := scanner.Text()
   fmt.Println(text)

উপরের প্রোগ্রামটির আউটপুট হবে:

Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]

উপরের প্রোগ্রামটি ব্যবহারকারী ইনপুট সংগ্রহ করে এবং সেগুলিকে একটি অ্যারেতে সংরক্ষণ করে। আমরা একটি বিশেষ চরিত্রের সাহায্যে সেই প্রবাহকেও ভাঙ্গতে পারি। স্ক্যানার উন্নত ব্যবহারের জন্য যেমন কাস্টম ফাংশন ইত্যাদি ব্যবহার করে বিভাজন, বিভিন্ন প্রকারের I / O স্ট্রিমগুলি (স্টিডিন, স্ট্রিং) ইত্যাদি স্ক্যান করতে পারে তার জন্য এপিআই সরবরাহ করে


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি কেবলমাত্র আরও সঠিক উত্তর নয় এটি আরও ভাল মানের।
ড্যানিয়েল ফারেল

11

লুপের মধ্যে একাধিক ইনপুটগুলি পড়ার অন্য একটি উপায় যা স্পেসগুলির সাহায্যে কোনও ইনপুট হ্যান্ডেল করতে পারে:

package main
import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var text string
    for text != "q" {  // break the loop if text == "q"
        fmt.Print("Enter your text: ")
        scanner.Scan()
        text = scanner.Text()
        if text != "q" {
            fmt.Println("Your text was: ", text)
        }
    }
}

আউটপুট:

Enter your text: Hello world!
Your text was:  Hello world!
Enter your text: Go is awesome!
Your text was:  Go is awesome!
Enter your text: q

2
আপনি সম্ভবত কেবলমাত্র অভ্যন্তরীণ "কিউ" চেকের বিরতি ব্যবহার করতে পারেন এবং এগুলি সমস্ত অসীম লুপে জড়িয়ে রাখতে পারেন। দারুণ উত্তর!
20-29 তে তেবানপ

2
দেখে মনে হচ্ছে আপনি এখন লুপের জন্যও শর্তাধীন পরিত্রাণ পেতে পারেন।
ইরবানানা

6

আমি পার্টিতে দেরি করছি। তবে কীভাবে একটি লাইনার:

data, err := ioutil.ReadAll(os.Stdin)

এবং একবার কমান্ড লাইনে ইনপুট প্রবেশ করা হলে ctrl + d (EOT) টিপুন।


কারণ os.Stdin'শেষ' নয় এটি সব পড়া অসম্ভব। আপনি কিছুক্ষণ অপেক্ষা করতে পারেন ...
জিপসিডেভ 5

2
ctrl + d অর্থাৎ eot টিপুন।
শিবেন্দ্র মিশ্র

3
হ্যাঁ, এটি করতে চান - এর সাথে ইমেলগুলি লেখার বিষয়টি মনে করিয়ে দেয় mail
জিপসিডেভ 5

5

এই কোডটি ব্যবহার করে দেখুন: -

var input string
func main() {
      fmt.Print("Enter Your Name=")
      fmt.Scanf("%s",&input)
      fmt.Println("Hello "+input)
      }

3
মনে হচ্ছে Scanf()সাদা স্ট্রিংগুলি স্ট্রিংয়ে গ্রহণ করবে না
ইস্লাম


3

কয়েকটি উত্সাহিত মানগুলিতে পরিষ্কারভাবে পড়ুন:

// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
    strings.TrimSpace(text), strings.TrimSpace(text2))

এখানে একটি রান:

Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"

2
স্ট্রিংয়ের পরেও দুর্দান্ত উপায় ri ট্রিমস্পেস '\ n' কে সরিয়ে দেয়। এবং আমি বিশ্বাস করি পাঠক। রিডস্ট্রিং ('\ n' )ও ক্রস প্ল্যাটফর্ম।
ব্যবহারকারী2707671

আমি পাবেন যে অধিকাংশ সময় আপনি এন অপসারণ \ ডিফল্টরূপে করতে চাই, কেন এটা @Naren Yellavula উত্তর হিসাবে ভাল bufio.NewScanner যে এটা
জন Balvin Arias


0

আমার ক্ষেত্রে, প্রোগ্রামটি অপেক্ষা করছিল না কারণ আমি watcherপ্রোগ্রামটি অটো চালানোর জন্য কমান্ডটি ব্যবহার করছিলাম । প্রোগ্রামটি ম্যানুয়ালি চালনার go run main.goফলে "পাঠ্য প্রবেশ করান" এবং শেষ পর্যন্ত কনসোলে মুদ্রণ করা হয়েছিল।

fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)

2
Scan*পরিবারের সীমাবদ্ধতা হ'ল তারা একটি সাদা স্থান (যেমন স্থান) বিভাজক পর্যন্ত পড়ে।
জর্জ টেরেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.