【问题标题】:linux stdin, stdout pipelinux标准输入,标准输出管道
【发布时间】:2015-06-12 14:42:15
【问题描述】:

我有一个brick.sprite。 我在 Debain 8 "Kali Linux" 中有一个可执行文件,代码如下:

#include <stdio.h>
#include <stdint.h>
#include <iostream>

/**
  * To use this file, pipe a sprite of the old format into stdin, and
  * redirect stdout to a second file of your chosing.  The sprite header
  * will be converted.  This tool has no error checking and assumes a valid
  * sprite header.  It is provided merely for convenience.
  */

int main( int argc, char *argv[] )
{
    uint8_t zero = 0;
    uint8_t val;
    int ret;

    /* Read in old width */
    ret = fread( &val, sizeof( val ), 1, stdin );
    /* Write empty value and then new */
    fwrite( &zero, sizeof( zero ), 1, stdout );
    fwrite( &val, sizeof( val ), 1, stdout );
    
    /* Read in old height */
    ret = fread( &val, sizeof( val ), 1, stdin );
		

    /* Write empty value and then new */
    fwrite( &zero, sizeof( zero ), 1, stdout );
    fwrite( &val, sizeof( val ), 1, stdout );

    /* Straight copy of bitdepth and format */
    ret = fread( &val, sizeof( val ), 1, stdin );
    fwrite( &val, sizeof( val ), 1, stdout );

    ret = fread( &val, sizeof( val ), 1, stdin );
    fwrite( &val, sizeof( val ), 1, stdout );

    /* Assuming horizontal and vertical stride of 1 */
    val = 1;
    fwrite( &val, sizeof( val ), 1, stdout );
    fwrite( &val, sizeof( val ), 1, stdout );
	
	printf("%d\n",ret);//set to avoid weird error

    /* Now just byte copy until end of stream */
    while( !feof( stdin ) )
    {
        ret = fread( &val, sizeof( val ), 1, stdin );
        
        if( !feof( stdin ) )
        {
            /* Only copy out if the last read didn't make an eof */
            fwrite( &val, sizeof( val ), 1, stdout );
        }
    }

    return 0;
}

将brick.sprite 转换为新格式。 我尝试了很多代码:

//convtool is the executable
convtool grep <brick.sprite date > brick2.sprite 
convtool <brick.sprite> brick2.sprite //This looks like that it goes in the right way...
convtool cat <brick.sprite> brick2.sprite
convtool 2> brick2.sprite > brick.sprite

我不熟悉 linux,但我需要知道。

感谢您的建议!

【问题讨论】:

  • brick.sprite是什么类型的文件?
  • 非常感谢!它是一个 png 文件,转换为二进制的 .sprite。

标签: linux pipe stdout stdin


【解决方案1】:

如果您打算将文件“brick.sprite”的内容重定向到“convtool”的标准输入,请使用&lt; 运算符。

convtool < brick.sprite

另一种方法是对内容进行分类(将文件的内容写入标准输出)并将其通过管道传输到您的工具中。

cat brick.sprite | convtool

您还想将工具的输出重定向到新文件brick2.sprite。将输出重定向到文件由 &gt; 运算符完成。

从上面完成两个变体:

convtool < brick.sprite > brick2.sprite
cat brick.sprite | convtool > brick2.sprite

第一个变种也可以在 windows 和 osx shell 上工作,它不是 linux 特定的。

一些提示:

// This is complete nonsense. 
// you use the name of linux tools/commands as argument of convtools.
convtool grep <brick.sprite date > brick2.sprite

//This looks like that it goes in the right way...
// this is one of the right ways ;-)
convtool < brick.sprite > brick2.sprite

// your convtool does not use arguments.
// But i think this would work too. "cat" is nonsense.
convtool cat <brick.sprite> brick2.sprite

// after performing this command you have written the eeror output stderr 
// to your brick2.sprite file and you have overwritten your 
// brick.sprite file with the std out. (I hope you have a copy ;-)
convtool 2> brick2.sprite > brick.sprite

【讨论】:

  • 谢谢你,我从来没有想过我会得到这样的答复。你帮了我。