如何在Swift for Linux中从标准输入中读取用户输入或字符流?
答案 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:文件Foundation / 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
包含输入字符。