标签: stdin

我无法冲洗stdin

如何刷新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作为输出?

c stdin fflush

17
推荐指数
3
解决办法
5万
查看次数

如何传递Rscript -ea多行字符串?

有没有办法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)

stdin r rscript

17
推荐指数
1
解决办法
1538
查看次数

如何重新初始化Perl的STDIN/STDOUT/STDERR?

我有一个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.

perl redirect stdin stdout stderr

16
推荐指数
2
解决办法
2万
查看次数

如何从CLI标准输入中读取非ASCII字符

如果我键入å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" -> ??äö 123434echo åäöåäö 1234- > ??äöåäö 1234 1234.

EDIT2(已解决):

问题是chcp 65001,现在我使用chcp 437 …

php stdin fgets character-encoding

16
推荐指数
1
解决办法
3062
查看次数

有没有办法将'stdin'作为参数传递给python中的另一个进程?

我正在尝试创建一个使用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)

python stdin multiprocessing

16
推荐指数
1
解决办法
7190
查看次数

sys.stdin.readline()读取没有提示,返回'之间没有'

我有一个执行以下功能的函数(除其他外):

userinput = stdin.readline()
betAmount = int(userinput)
Run Code Online (Sandbox Code Playgroud)

应该将stdin的输入整数作为字符串并将其转换为整数.

但是,当我调用该函数时,它会返回一个换行符(它甚至不会等我输入任何内容).

在程序的早期,我得到了以下形式的一些输入:

stdin.read(1)
Run Code Online (Sandbox Code Playgroud)

捕获单个字符.

这可能与它有关吗?我是否以某种方式将换行符写入stdin的下一行?

我怎样才能解决这个问题?

python stdin python-3.x

16
推荐指数
2
解决办法
11万
查看次数

如何将输出管道输出到Visual Studio代码?

我想将命令的输出传递到Visual Studio Code中的新文本窗口.

通常,我会做这样的事情:

echo foo | code
Run Code Online (Sandbox Code Playgroud)

......但这似乎不起作用; VSCode启动但不显示输入.有没有办法在命令行上进行管道?

stdin pipe visual-studio-code

16
推荐指数
1
解决办法
7131
查看次数

从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
查看次数

写入stdin并从stdout读取(UNIX/LINUX/C编程)

我工作的分配,其中一个程序把文件描述符作为参数(一般在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)

c unix stdin stdout read-write

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

管道字符串到GNU日期转换 - 如何从stdin读取?

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)

但它打印今天的日期而不是昨天.

是否可以将值传递给它或不支持它?

谢谢.

linux stdin date pipe

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