相关疑难解决方法(0)

从stdin读取标准输出?

当连接到终端时,stdout是行缓冲的,但我记得在某处读取(至少从stdin)将自动刷新stdout.我使用的所有C实现都已经完成了,但我现在无法在标准中找到它.

它确实有意义,它是这样的,否则代码如下:

printf("Type some input: ");
fgets(line, sizeof line, stdin);
Run Code Online (Sandbox Code Playgroud)

需要一个额外的 fflush(stdout);

那么stdout肯定会在这里刷新吗?

编辑:

正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:

交互设备的输入和输出动态应按照7.19.3的规定进行.这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息.

(ISO/IEC 9899:TC2委员会草案 - 2005年5月6日,第14页).

所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)

c stdin stdout flush

15
推荐指数
2
解决办法
4490
查看次数

为什么在以下示例中不应使用缓冲?

我正在阅读本教程:http: //www.catonmat.net/blog/simple-haskell-tcp-server/ 了解Haskell网络模块的基础知识.他写了一个名为sockHandler的小函数:

sockHandler :: Socket -> IO ()
sockHandler sock = do
    (handle, _, _) <- accept sock
    hSetBuffering handle NoBuffering
    forkIO $ commandProcessor handle
    sockHandler sock
Run Code Online (Sandbox Code Playgroud)

接受连接,并将其分配给新线程.在打破代码的同时,他说:

"接下来我们使用hSetBuffering将客户端套接字句柄的缓冲模式更改为NoBuffering,因此我们没有缓冲惊喜."

但是没有详细说明这一点.他在谈论什么惊喜?我谷歌了,看到了一些安全文章(我猜测与被拦截的缓存有关),但似乎与本教程的内容没什么关系.

有什么问题?我想到了,但我认为我没有足够的网络经验来填补空白.

谢谢.

networking buffer haskell

2
推荐指数
1
解决办法
130
查看次数

在haskell中带有提示的奇怪缓冲

我在Haskell玩耍时发现了一些奇怪的东西.我在下面定义了一个简单的提示函数.

-- file: test.hs
main :: IO ()
main = putStrLn . ("Hello, " ++) =<< (putStr "Name: " >> getLine)
Run Code Online (Sandbox Code Playgroud)

当我runhaskell这样,它按预期工作,打印提示,等待我的输入,然后打印问候语.

$ runhaskell test.hs
Name: kwarrtz
Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)

然而,当我编译它时,事情变得奇怪.当我运行它时,它不会打印提示,而是给我一个空行并等待输入.当我输入我的名字并按Enter键时,它会在同一行打印提示和问候语.换句话说,getLine发生在之前putStr.

$ ghc test.hs
$ ./test
kwarrtz
Name: Hello, kwarrtz
Run Code Online (Sandbox Code Playgroud)

对发生了什么的任何想法?我想它与终端上的线路缓冲有关,但我不确定(我或者我在代码中犯了一些非常荒谬的错误).

我在Mac OS X El Capitan上运行GHC 7.8.3并使用默认的终端应用程序.

haskell

0
推荐指数
1
解决办法
88
查看次数

标签 统计

haskell ×2

buffer ×1

c ×1

flush ×1

networking ×1

stdin ×1

stdout ×1