Powershell使用scanf进行编程的管道

时间:2016-02-11 11:35:56

标签: c++ windows powershell pipe scanf

最近我从Windows'cmd.exe迁移到了PowerShell。后来我发现Microsoft决定放弃标准的stdin重定向方法abc.exe < input.txt并建议使用Get-Content input.txt | .\abc.exe

不幸的是,新方法崩溃了我的应用程序。我创建了这个简单的程序来找到问题的根源

#include <cstdio>

int main() {
    int x = -1;
    scanf("%d", &x);
    printf("%d", x);

    return 0;
}

并发现此测试程序在input.txt内返回-1而不是数字。

我还测试了echo 1 | .\abc.exetype input.txt | .\abc.exe等命令,并且所有命令都将-1打印到stdout。

如果有任何帮助,我将不胜感激。

修改1:

$ OutputEncoding命令的结果:

IsSingleByte      : True                                  
BodyName          : us-ascii                              
EncodingName      : US-ASCII                              
HeaderName        : us-ascii                              
WebName           : us-ascii                              
WindowsCodePage   : 1252                                  
IsBrowserDisplay  : False                                 
IsBrowserSave     : False                                 
IsMailNewsDisplay : True                                  
IsMailNewsSave    : True                                  
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True                                  
CodePage          : 20127

编辑2:

我创建了这个简单的程序来查看管道编程的内容:

#include <cstdio>

int main() {

    char l;
    while(scanf("%c", &l)) {
        printf("%d\n", l);
    }

    return 0;
}

运行Get-Content input.txt | .\abc.exe后,它会保持打印10,这与ASCII“换行”字符相对应。

1 个答案:

答案 0 :(得分:1)

显然,PowerShell有多个地方需要在一切开始正常工作之前设置编码。

最后,我想出了这个解决方案 - 在PS文件文件中添加此文本下方的行:

[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
chcp 1250 // Change here for preferable Windows Code Page. 1250 is Central Europe
$OutputEncoding = [Console]::OutputEncoding
Clear-Host // clear screen because chcp prints text "Active code page: (code page)"

包含这些行后,Get-Content开始正常运行。