macos - 在 Swift 中使用 NSInputStream 从 STDIN 获取输入

标签 macos swift stdin

我知道如何使用 NSFileHandle 从 STDIN 读取数据,但我想知道 (1) 是否可以使用 NSInputStream 从 STDIN 读取数据。另外,我在代码下面编写了代码,另一个问题是(2)为什么会抛出异常?好像是inputStream!有可用字节。

#!/usr/bin/env xcrun swift

import Foundation

let inputStream             = NSInputStream(fileAtPath: "/dev/stdin")

inputStream!.open()

println(inputStream!.hasBytesAvailable)

if(inputStream!.hasBytesAvailable) {
  let readBufferRef         = UnsafeMutablePointer<UnsafeMutablePointer<UInt8>>()
  let readBufferLengthRef   = UnsafeMutablePointer<Int>()
  let readBufferIsAvailable = inputStream!.getBuffer(readBufferRef, length: readBufferLengthRef)

  if readBufferIsAvailable {
    println("Yay")
  }
}

println("Heck")


$ printf "%d\n%d\n" 1 2 | ./stdin_stdout_2.swift 
true
0  swift                    0x000000010d410b68 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x000000010d411054 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff9a7bdf1a _sigtramp + 26
3  libsystem_platform.dylib 0x00007fff534ade70 _sigtramp + 3100573552
4  CoreFoundation           0x00007fff8f59fc17 -[__NSCFInputStream getBuffer:length:] + 23
5  CoreFoundation           0x00000001114c4314 -[__NSCFInputStream getBuffer:length:] + 2180138772
6  swift                    0x000000010ca85c39 llvm::JIT::runFunction(llvm::Function*, std::__1::vector<llvm::GenericValue, std::__1::allocator<llvm::GenericValue> > const&) + 329
7  swift                    0x000000010cd320b3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 1523
8  swift                    0x000000010c96e6ba swift::RunImmediately(swift::CompilerInstance&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 1066
9  swift                    0x000000010c75764b frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 5275
10 swift                    0x000000010c754a6d main + 1677
11 libdyld.dylib            0x00007fff98fca5c9 start + 1
12 libdyld.dylib            0x000000000000000d start + 1728272965
Stack dump:
0.  Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret ./stdin_stdout_2.swift -target x86_64-apple-darwin14.1.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -color-diagnostics -module-name stdin_stdout_2 
Segmentation fault: 11

最佳答案

问题是使用UnsafeMutablePointer<UnsafeMutablePointer<UInt8>>()对于 readBufferRefUnsafeMutablePointer<Int>()对于 readBufferLengthRef .

修改后的代码

#!/usr/bin/env xcrun swift

import Foundation

let inputStream                = NSInputStream(fileAtPath: "/dev/stdin")

inputStream!.open()

println(inputStream!.hasBytesAvailable)

if(inputStream!.hasBytesAvailable) {
  // var readBufferRef         = UnsafeMutablePointer<UnsafeMutablePointer<UInt8>>()
  var readBufferRef            = UnsafeMutablePointer<UInt8>()
  // var readBufferLengthRef   = UnsafeMutablePointer<Int>()
  var readBufferLengthRef      = 0
  // let readBufferIsAvailable = inputStream!.getBuffer(readBufferRef, length: readBufferLengthRef)
  let readBufferIsAvailable    = inputStream!.getBuffer(&readBufferRef, length: &readBufferLengthRef)

  if readBufferIsAvailable {
    println("Yay")
  }
}

println("Heck")

关于macos - 在 Swift 中使用 NSInputStream 从 STDIN 获取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29302904/

相关文章:

c++ - 关于dup2和多线程的问题

python - 使用 pygsr 进行语音识别时出错

ios - 如何从 Parse 中删除对象?

ios - Swift:写这个数组映射的更优雅的方式?

ios - 真正理解iOS中的NSData、NSMutableData、NSString应该学什么?

c++ - 使用 istream_iterator 并从标准输入或文件中读取

在线法官中来自 stdin 的 Python 输入

macos - 为什么 NSTableCellView.backgroundStyle 永远不会为选定的行设置为 NSBackgroundStyle.Dark?

macos - 无法打印到标准输出

linux - 使用 C/C++ 应用程序持续监控 linux 控制台日志