如何刷新stdin?
为什么它不能在以下代码片段中工作?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main()
{
int i=0,j=0, sat;
char arg[256];
char * argq;
argq = malloc(sizeof(char)*10);
printf("Input the line\n");
i=read(0, arg, sizeof(char)*9);
arg[i-1]='\0';
fflush(stdin);
i=read(0, argq, sizeof(char)*5);
argq[i-1]='\0';
puts(arg);
puts(argq);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我将输入作为11个字符,则只应读取9个,但是stdin中剩余的两个字符不会被刷新并在argq中再次读取.为什么?
输入:123 456 789
产出:123 456 89
为什么我将这89作为输出?
有没有办法Rscript -e在多行中提供代码?
这在香草R中是可能的
R --vanilla <<code
a <- "hello\n"
cat(a)
code
Run Code Online (Sandbox Code Playgroud)
但Rscript根据R版本,我使用两种不同的东西.
# R 3.0.2 gives two ignores
Rscript -e '
quote> a <- 3+3
quote> cat(a, "\n")
quote> '
# ARGUMENT 'cat(a,~+~"' __ignored__
# ARGUMENT '")' __ignored__
Rscript -e 'a <- 3+3;cat(a, "\n")'
# ARGUMENT '")' __ignored__
# R 2.15.3 gives an ignore for the multiline, but it works with semicolons
Rscript -e '
quote> a <- 3+3
quote> cat(a, "\n")
quote> '
# ARGUMENT …Run Code Online (Sandbox Code Playgroud) 我有一个Perl脚本,它自己分叉和守护.它由cron运行,所以为了不留下僵尸,我关闭了STDIN,STDOUT和STDERR:
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
do_some_fork_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我想在此之后恢复至少STDOUT(恢复其他2会很好).但是我需要使用什么魔术符号来重新打开STDOUT,就像STDOUT一样?
我知道如果我是从tty运行的话我可以使用"/ dev/tty"(但我是从cron运行并依赖于其他地方的stdout).我也读过你可以把STDOUT放在一边的技巧open SAVEOUT,">&STDOUT",但只是制作这个副本的行为并没有解决留下僵尸的原始问题.
我正在寻找是否有一些神奇的东西open STDOUT,"|-"(我知道不是这样)以打开它应该打开的方式打开STDOUT.
如果我键入åCMD,fgets将停止等待更多输入,并且循环运行直到我按下ctrl-c.如果我输入像a-z0-9这样的"普通"字符!?()它按预期工作.
我在Windows 7下使用UTF-8作为charset(chcp 65001)在CMD中运行代码,文件保存为UTF-8而不是bom.我使用PHP 5.3.5(cli).
<?php
echo "ÅÄÖåäö work here.\n";
while(1)
{
echo '> '. fgets(STDIN);
}
?>
Run Code Online (Sandbox Code Playgroud)
如果我将字符集更改为chcp 1252循环不会在我键入时打破å并且打印">å"但是"ÅÄÖåäö在这里工作"变成"Ã...Ã"Ã-Ã¥ÃÃ在这里工作!".我知道我可以将文件更改为ANSI,但是我不能使用像╠╦╗这样的特殊字符.
那么为什么fgets在输入åäö之后会停止等待用户输入?
我该如何解决这个问题?
编辑:
还发现了一个奇怪的bug.
echo "öäåÅÄÖåäö work here! Or?".chr(10);- > ??äåÅÄÖåäö work here! Or? re! Or?.如果echo中的第一个字符是å/ä/ö打印奇怪的字符,那么结束输出副本的n - 1字符为char ..(n =字符串开头的åäö的数字).
例如:echo "åäö 1234" -> ??äö 123434和echo åäöåäö 1234- > ??äöåäö 1234 1234.
EDIT2(已解决):
问题是chcp 65001,现在我使用chcp 437 …
我正在尝试创建一个使用python的多处理模块的脚本.脚本(让我们称之为myscript.py)将从另一个带有管道的脚本获取输入.
假设我像这样调用脚本;
$ python writer.py | python myscript.py
Run Code Online (Sandbox Code Playgroud)
这是代码;
// writer.py
import time, sys
def main():
while True:
print "test"
sys.stdout.flush()
time.sleep(1)
main()
//myscript.py
def get_input():
while True:
text = sys.stdin.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=())
p1.start()
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为sys.stdin对象对于主进程和p1是不同的.所以我试过这个解决它,
//myscript.py
def get_input(temp):
while True:
text = temp.readline()
print "hello " + text
time.sleep(3)
if __name__ == '__main__':
p1 = Process(target=get_input, args=(sys.stdin,))
p1.start()
Run Code Online (Sandbox Code Playgroud)
但我遇到了这个错误;
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", …Run Code Online (Sandbox Code Playgroud) 我有一个执行以下功能的函数(除其他外):
userinput = stdin.readline()
betAmount = int(userinput)
Run Code Online (Sandbox Code Playgroud)
应该将stdin的输入整数作为字符串并将其转换为整数.
但是,当我调用该函数时,它会返回一个换行符(它甚至不会等我输入任何内容).
在程序的早期,我得到了以下形式的一些输入:
stdin.read(1)
Run Code Online (Sandbox Code Playgroud)
捕获单个字符.
这可能与它有关吗?我是否以某种方式将换行符写入stdin的下一行?
我怎样才能解决这个问题?
我想将命令的输出传递到Visual Studio Code中的新文本窗口.
通常,我会做这样的事情:
echo foo | code
Run Code Online (Sandbox Code Playgroud)
......但这似乎不起作用; VSCode启动但不显示输入.有没有办法在命令行上进行管道?
当连接到终端时,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页).
所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)
我工作的分配,其中一个程序把文件描述符作为参数(一般在exec调用父),并从文件中读取和写入文件的描述符,并在我的测试中,我意识到,程序会工作从命令行开始,如果我使用0,1或2作为文件描述符,则不会出错.这对我来说很有意义,除了我可以写入stdin并让它显示在屏幕上.
对此有解释吗?我一直认为在stdin/stdout上有一些保护,你当然不能从stdout到stdin或fgetsf.
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
char message[20];
read(STDOUT_FILENO, message, 20);
write(STDIN_FILENO, message, 20);
return 0;
}
Run Code Online (Sandbox Code Playgroud) GNU Date允许您转换日期字符串,如下所示:
$ date +"%d %m %Y" -d "yesterday"
04 01 2012
Run Code Online (Sandbox Code Playgroud)
是否可以将日期字符串传递给它进行转换?我已经尝试了这样明显的-d -事情:
$ echo "yesterday" | date +"%d %m %Y" -d -
Run Code Online (Sandbox Code Playgroud)
但它打印今天的日期而不是昨天.
是否可以将值传递给它或不支持它?
谢谢.