今天想在Sphere Online Judge中用PHP来在线挑战一些题目,要用到标准输入输出,但最近在写php又不想用c来写,平时写项目都是表单提交,还真没有考虑过这个,于是看了下文档。
文档在此:http://php.net/manual/zh/wrappers.php.php
一、PHP STDIN、STDOUT、STDERR简介:
STDIN
、STDOUT
、STDERR
命令输入输出流,用于向控制台(linux shell终端、windows cmd终端)输入、输出内容,它们默认是已经打开的,可以直接对他们进行读写操作,它们只能在CLI(command-line interface,命令行界面)模式中使用,在Http模式时,它们是未定义的。
而他们的打开副本php://stdin
、php://stdout
、php://stderr
也无法输出内容到http浏览器,经测试:写入php://stderr
的内容将会输入到默认站点的错误日志中,其它两种无任何效果。
STDIN/STDOUT/STDERR简介:
原始流 | 流打开副本 | 描述 |
---|---|---|
STDIN | php://stdin | 标准输入(standard input),只读,用于从控制台输入内容; |
STDOUT | php://stdout | 标准输出(standard output),只写,用于向控制台输出正常信息; |
STDERR | php://stderr | 错误输出(standard error),只写,用于向控制台输出错误信息; |
官方推荐使用常量 STDIN、 STDOUT 和 STDERR 来代替它们手动打开的副本封装器php://stdin
、 php://stdout
和 php://stderr
。
二、PHP STDIN用法:
PHP语言中"STDIN"用于从控制台读取内容,遇到此常量或者通过fopen()
函数打开php://stdin
脚本将会等待用户输入内容,直到用户按下回车键提交。
写个stdin.php
测试一下:
<?php
echo "请输入内容:";
$jimmy = fgets(STDIN);
echo sprintf("输入的内容为: %s\n", $jimmy);
$demo = fopen('php://stdin', 'r');
echo "请输入: ";
$test = fread($demo, 12); //最多读取12个字符
echo sprintf("输入为: %s\n", $test);
fclose($demo);
运行结果:
请输入内容:sad
输入的内容为: sad
请输入: asdasdasdasdasdasd
输入为: asdasdasdasd(这里因为设置了最多读取12个字符,设置更多一些就可以完整显示)
三、PHP STDOUT用法:
PHP语言中STDOUT
用于向控制台输出标准信息;向此常量、或者向fopen()函数打开的php://stdout
写入的内容将直接输出到控制台的标准输出;标准输出的内容可以用过">"或者"1>"重定向到指定地方,比如文件。
同理我们写个文件来测试一下
<?php
fwrite(STDOUT, "通过STDOUT写入;\n");
$demo = fopen("php://stdout", "w");
fwrite($demo, "通过php://stdout写入;");
fclose($demo);
运行一下:
☁ test php demo.php > a.txt
☁ test cat a.txt
通过STDOUT写入;
通过php://stdout写入;%
☁ test php demo.php
通过STDOUT写入;
通过php://stdout写入;%
☁ test
四、PHP STDERR用法:
PHP语言中"STDERR"用于向控制台输出错误信息;向常量、或者向fopen()函数打开的"php://stderr"写入的内容将直接输出到控制台的错误输出;错误输出的内容可以用过"2>"重定向到指定地方,比如文件;也可以使用"2>&1"将错误输出定向到标准输出,与标准输出合并。
我们测试一下
<?php
fwrite(STDERR, "STDERR写入的错误输出;\n");
fwrite(STDOUT, "STDOUT写入的正常输出;\n");
$stdout = fopen("php://stdout", "w");
fwrite($stdout, "php://stdout写入的正常输出;\n");
fclose($stdout);
$stderr = fopen("php://stderr", "w");
fwrite($stderr, "php://stderr写入的错误输出;\n");
fclose($stderr);
正常输出和错误输出分别定向到不同文件:
☁ test php demo.php 1>demo.ok 2>demo.err
☁ test cat demo.ok
STDOUT写入的正常输出;
php://stdout写入的正常输出;
☁ test cat demo.err
STDERR写入的错误输出;
php://stderr写入的错误输出;
正常输出和错误输出合并定向到统一文件:
☁ test php demo.php 1>AllInOne 2>&1
☁ test cat AllInOne
STDERR写入的错误输出;
STDOUT写入的正常输出;
php://stdout写入的正常输出;
php://stderr写入的错误输出;
好了,接下来可以去Sphere Online Judge叱咤风云了,先测试个demo题目
写个代码
<?php
// your code here
$x=0;
while($x!=42){
$x = fgets(STDIN);
if($x!=42){
echo sprintf("%d\n",$x);
}
}
?>
提交
哈哈哈哈,完全ok,再也不用限制于java和c了,我可以用PHP挑战一些题目了,大家也可以去试试?
个人订阅号
Jimmy的技术乐园
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。