标签: stdin

从文件或标准输入读取

我正在编写一个实用程序,它接受文件名或从stdin读取.

我想知道检查stdin是否存在的最强大/最快的方式(数据是否通过管道传输到程序),如果是,则读取该数据.如果不存在,则处理将在文件名上进行给出.我已经尝试使用以下测试的大小,stdin但我相信,因为它是一个流而不是一个实际的文件,它不起作用,因为我怀疑它会,它总是打印-1.我知道我总是可以一次读取输入1个字符!= EOF但是我想要一个更通用的解决方案,所以如果stdin存在我最终会得到fd或FILE*所以程序的其余部分将无缝运行.我希望能够知道它的大小,等待前一个程序关闭流.

long getSizeOfInput(FILE *input){
  long retvalue = 0;
  fseek(input, 0L, SEEK_END);
  retvalue = ftell(input);
  fseek(input, 0L, SEEK_SET);
  return retvalue;
}

int main(int argc, char **argv) {
  printf("Size of stdin: %ld\n", getSizeOfInput(stdin));
  exit(0);
}
Run Code Online (Sandbox Code Playgroud)

终奌站:

$ echo "hi!" | myprog
Size of stdin: -1
Run Code Online (Sandbox Code Playgroud)

c io stdin file stream

29
推荐指数
4
解决办法
11万
查看次数

使用python进行交互式输入/输出

我有一个与用户交互的程序(就像一个shell),我想以交互方式使用python子进程模块运行它.这意味着,我希望有可能写入stdin并立即从stdout获取输出.我在这里尝试了许多解决方案,但它们似乎都不能满足我的需求.

我编写的代码基于在python中运行交互式命令

import Queue
import threading
import subprocess
def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

def getOutput(outQueue):
    outStr = ''
    try:
        while True: #Adds output from the Queue until it is empty
            outStr+=outQueue.get_nowait()

    except Queue.Empty:
        return outStr

p = subprocess.Popen("./a.out", stdin=subprocess.PIPE, stout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize = 1)
#p = subprocess.Popen("./a.out", stdin=subprocess.PIPE, stout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, universal_newlines=True)

outQueue = Queue()
errQueue = Queue()

outThread = Thread(target=enqueue_output, args=(p.stdout, outQueue))
errThread = Thread(target=enqueue_output, args=(p.stderr, errQueue))

outThread.daemon = True
errThread.daemon = True …
Run Code Online (Sandbox Code Playgroud)

python stdin subprocess interactive stdout

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

在Delphi控制台应用程序中打开stdin/stdout上的TStream

我正在尝试编写一个Delphi控制台应用程序,为其标准输入创建一个TStream,为其标准输出创建另一个TStream.

(它将由主机应用程序启动,其输入和输出重定向到管道,并将二进制数据传入/传出该主机应用程序,因此TStream将比ReadLn/WriteLn更适合于该任务.)

如何在标准输入或标准输出上打开TStream?

delphi stdin stdout console-application tstream

28
推荐指数
1
解决办法
5680
查看次数

如何将变量作为stdin从PHP传递到命令行

我正在尝试编写一个PHP脚本,该脚本使用pdftk应用程序将XFDF与PDF表单合并,并将合并的PDF输出给用户.根据pdftk文档,我可以在via中传递表单数据stdin并将PDF输出到stdout流中.从命令行使用pdftk的常规文件非流方式是:

pdftk blankform.pdf fill_form formdata.xfdf output filledform.pdf
Run Code Online (Sandbox Code Playgroud)

要在命令行上使用流,您需要输入:

pdftk blankform.pdf fill_form - output -
Run Code Online (Sandbox Code Playgroud)

我有几个问题:

1)我已经通过stdout使用xfdf文件(而不是stdin)来获得pdftk返回输出,如下所示:

    exec("pdftk blankform.pdf fill_form formdata.xfdf output -", $pdf_output);
    file_put_contents("filledform.pdf",$pdf_output);
Run Code Online (Sandbox Code Playgroud)

但是根据Adobe Reader的说法,它创建的pdf是破坏的,并且用文本编辑器快速查看文件显示,至少,它并没有将行结束设置在应有的位置.我有一个相同的PDF由pdftk创建,它输出到一个文件,pdf在文本编辑器中看起来很好,所以我知道它不是pdftk输出坏数据.

2)我不能为我的生活弄清楚如何stdin在PHP中设置流,以便我可以使用该流作为我的pdftk输入.从我在PHP文档中阅读的内容来看,它stdin是只读的,那么如何进入该流?

理想情况下,我想保持这个非常简单并避免使用proc_open().我尝试使用该功能并且不是非常成功,这可能是我的错,而不是功能,但实际上我的目标很简单,我宁愿避免使用我不需要的强大功能.

理想情况下,我的代码看起来像:

 $form_data_raw = $_POST;
 $form_data_xfdf = raw2xfdf($form_data_raw); //some function that turns HTML-form data to XFDF

 $blank_pdf_form = "blankform.pdf";

 header('Content-type: application/pdf');
 header('Content-Disposition: attachment; filename="output.pdf"');

 passthru("pdftk $blank_pdf_form fill_form $form_data_xfdf output -);
Run Code Online (Sandbox Code Playgroud)

只是抬头,可以将实际的xml字符串放在命令行中,但是我的结果非常不可靠.

编辑

在很多帮助下,我现在明白我的真正问题是"如何在PHP中将变量传递给命令行执行".显然,proc_open是最好的方式,或者至少是最直接的方式.因为我花了很长时间才弄清楚,因为我对Google的研究表明其他人可能会苦苦挣扎,我会发布专门针对我的问题的代码:

$blank_pdf_form = …
Run Code Online (Sandbox Code Playgroud)

php command-line stdin stream pdftk

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

Fortran 90中的标准输入和输出单元?

如何读取和写入标准输入,输出和错误流stdin,stdout以及stderr在Fortran中?我听说写stderr,例如,使用write(5, fmt=...)5单位的stderr,我知道写的方式stdout是使用write(*, fmt=...).

如何使用ifort编译器读取和写入标准输入和输出单元?

编译器版本:

英特尔(R)Fortran编译器,用于运行在英特尔(R)64,版本10.0 Build 20070426上的应用程序包ID:l_fc_p_10.0.023版权所有(C)1985-2007英特尔公司.版权所有

stdin fortran stdout stderr fortran90

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

如何在linux上管道输入到sublimetext?

如何从stdin接收文本到sublimetext编辑器?使用vim它的工作原理如下:

echo "potato potato potato" | vim -
Run Code Online (Sandbox Code Playgroud)

同样适用于gedit,使用内容创建一个新文档.

Sublimetext似乎只是在一个新标签中开始编辑一个名为" - "的文件,还有其他一些shell技巧可以使用吗?

linux bash stdin pipe sublimetext

27
推荐指数
4
解决办法
8423
查看次数

如何检测Console.In(stdin)是否已被重定向?

我想编写一个具有不同行为的控制台应用程序,具体取决于输入是来自键盘还是来自文件.

可能吗?在C#中最优雅的方法是什么?

c# console redirect stdin

25
推荐指数
2
解决办法
9484
查看次数

PHP CLI:如何从TTY读取单个输入字符(无需等待回车键)?

我想读的,一时间从PHP命令行中的一个字符,但它好像有某种输入缓冲从某处防止这种.

考虑以下代码:

#!/usr/bin/php
<?php
echo "input# ";
while ($c = fread(STDIN, 1)) {
    echo "Read from STDIN: " . $c . "\ninput# ";
}
?>
Run Code Online (Sandbox Code Playgroud)

键入"foo"作为输入(并按Enter键),我得到的输出是:

input# foo
Read from STDIN: f
input# Read from STDIN: o
input# Read from STDIN: o
input# Read from STDIN: 

input# 
Run Code Online (Sandbox Code Playgroud)

期待的输出是:

input# f
input# Read from STDIN: f

input# o
input# Read from STDIN: o

input# o
input# Read from STDIN: o

input# 
input# Read from STDIN: 

input# 
Run Code Online (Sandbox Code Playgroud)

(即,在键入字符时读取和处理字符).

但是,目前,只有在按下输入后才会读取每个字符.我怀疑TTY正在缓冲输入.

最终我希望能够读取按下箭头,向下箭头等按键.

php stdin command-line-interface buffering tty

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

你怎么从没有结束的管道读取python中的stdin

当管道来自"打开"(不知道正确的名称)文件时,我有问题从python中的标准输入或管道读取.

我有例如 pipetest.py:

import sys
import time
k = 0
try:
   for line in sys.stdin:
      k = k + 1
      print line
except KeyboardInterrupt:
   sys.stdout.flush()
   pass
print k
Run Code Online (Sandbox Code Playgroud)

我运行了一段时间后继续输出和Ctrl + c的程序

$ ping 127.0.0.1 | python pipetest.py
^C0
Run Code Online (Sandbox Code Playgroud)

我没有输出.但如果我通过一个普通的文件,它的工作原理.

$ ping 127.0.0.1 > testfile.txt
Run Code Online (Sandbox Code Playgroud)

一段时间后,这将以Ctrl + c结束

$ cat testfile.txt |  python pipetest.py

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.015 ms
64 bytes from 127.0.0.1: …
Run Code Online (Sandbox Code Playgroud)

python stdin pipe

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

从stdin读取所有文本

我正在Node.js中编写一个程序(在某些情况下)想要充当一个简单的过滤器:从stdin读取所有内容(直到文件末尾),进行一些处理,将结果写入stdout.

你怎么做'从stdin'读取一切?到目前为止我发现的最接近的解决方案,似乎一次从控制台一行一行,或者只在stdin是文件而不是管道时工作.

stdin synchronous node.js

25
推荐指数
4
解决办法
7035
查看次数