如何在Swift for Linux中读取用户输入或stdin?

时间:2015-12-06 10:11:01

标签: linux swift

如何在Swift for Linux中从标准输入中读取用户输入或字符流?

3 个答案:

答案 0 :(得分:8)

readLine()适用于Ubuntu 15:

  

[Readline]返回从标准输入读取的Character的结尾   当前行或直到达到EOF,或者如果EOF已经到达nil   达到。

示例:

print("\nEnter your name:\n")
if let name = readLine() {
    print("\nHello \(name)!\n")
}
  

ed @ swiftux:〜/ Swift / Scripts $ ./testReadline

     

输入您的姓名:

     

埃里克

     

Hello Eric!

readline()也适用于|(管道):

  

ed @ swiftux:〜/ Swift / Scripts $ echo“Mike”| ./testReadline

     

输入您的姓名:

     

你好Mike!

我也尝试过使用NSFileHandle的经典方法,但它还没有实现:

  

致命错误:尚未实现availableData:文件Fou​​ndation / NSObjCRuntime.swift

答案 1 :(得分:1)

如果您在Linux上导入Glibc并在macOS上导入Darwin.C,那么您可以使用getline函数一次读取一行。

这需要一点点c interop,但是你可以把它包起来呈现更多的Swifty接口。例如,以下函数返回一个生成器,该生成器迭代从文件流中读取的行:

#if os(Linux)
  import Glibc
#else
  import Darwin.C
#endif

func lineGenerator(file:UnsafeMutablePointer<FILE>) -> AnyIterator<String>
{
  return AnyIterator { () -> String? in
    var line:UnsafeMutablePointer<CChar>? = nil
    var linecap:Int = 0
    defer { free(line) }
    let charactersWritten = getline(&line, &linecap, file)

    if charactersWritten > 0 {
      guard let line = line else { return nil }
      return String(validatingUTF8: line)
    }
    else {
      return nil
    }
  }
}

这适用于Swift 3.您可以找到一个小的swiftecho example project,它可以从命令行执行此操作。

答案 2 :(得分:0)

我找到了一种从stdin读取字符的方法,但它并不漂亮,但它显示了我们可以通过Glibc执行的操作。

import Glibc

var buf = UnsafeMutablePointer<CChar>.alloc(32)

fread(buf, 1, 32, stdin)

// or

fgets(buf, 32, stdin)

buf包含输入字符。