2016-02-11 122 views
1

最近我從Windows的cmd.exe移到PowerShell。後來我發現微軟決定放棄標準stdin重定向方法abc.exe < input.txt並建議使用Get-Content input.txt | .\abc.exePowershell的管道使用scanf編程

不幸的是,新方法崩潰了我的應用程序。我創造了這個簡單的程序,以發現問題

#include <cstdio> 

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

    return 0; 
} 

的來源,發現這個測試程序將返回-1,而不是內部input.txt的數量。

我也測試過像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「換行」字符。

+0

在PowerShell中顯示'$ OutputEncoding'的值。同時重寫本機應用程序以通過字符讀取字符並打印讀取代碼,從而知道究竟是通過什麼進行傳送的。 – PetSerAl

+0

您的**編輯2 **程序不會停在'EOF'上,並繼續打印最後一個字符。它應該是'while(scanf(「%c」,&l)!= EOF)''。我也編譯你的第一個測試程序,它對我來說工作得很好。我鍵入:'echo 12345 | 。\ test.exe「,並打印」12345「。 – PetSerAl

+0

最近我一直在搞PowerShell,以使Python在控制檯中正確顯示Unicode字符(例如:'print'ąę'''在控制檯中產生ae')。當我這樣做時,我已經找到了添加這些行的解決方案:[Console] :: InputEncoding = [System.Text.Encoding] :: UTF8', '[Console] :: OutputEncoding = [System.Text.Encoding] :: UTF8'到PS配置文件配置。結果是scanf收到了附加的字節。 –

回答

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開始正確運行之後。