2011-03-03 55 views
1

我想知道如何更改我的程序當前流? 我的意思是我想從文件中得到我的輸入。在C語言中更改流

+2

你是什麼意思'流' - stdio/out/err?或者是其他東西? – Rup 2011-03-03 15:24:10

+2

請提供您想要做什麼的更多細節。這個問題太模糊不清,很可能會被解決。 – 2011-03-03 15:25:28

回答

5

假設你正在談論標準CI/O流由FILE *對象來表示stdin和stdout,你可以用freopen()

/* Change stdin to read from the given file. */ 
freopen("funny-input.txt", "rt", stdin); 
+0

我同意你的想法,但我這樣做(用於將文件複製到另一個文件),但是我沒有遇到任何問題,但是我的朋友寫他的程序與我的程序一樣,並且運行良好。 – amin 2011-03-03 15:53:59

+1

@amin:編輯問題以包含您嘗試過的某些代碼無法使用的代碼,如果您想要幫助確定它爲什麼不起作用。 – aschepler 2011-03-03 15:58:50

+0

'「rt」'mode「read * turbo *」? :-) – pmg 2011-03-03 16:10:49

0

功能freopen()用於已經改變的分配打開文件流。它採用C89標準C--儘管鏈接符合POSIX標準。

1

也許你有這樣的程序:

#include <stdio> 
int main(int ac, char **av) { 
    int i; 
    if(scanf("%d", &i) == 1) 
     printf("Answer: %d\n", i); 
    else 
     printf("No answer\n"); 
    return 0; 
} 

,並要「改變你的當前流」。除了其他地方列出的「freopen」選項之外,您可能還想重定向您的輸入。如果你使用shell(UNIX)或控制檯窗口(Windows)中調用程序:

C:\> MYPROG.EXE 

相反,調用它正是如此

C:\> MYPROG.EXE < INPUTFILE.TXT 

在這種情況下,所有輸入到stdin(例如,scanf,getchar等)將來自名爲INPUTFILE.TXT的文件,而不是您的鍵盤。

或者,你可以在你的程序中打開文件:

#include <stdio> 
int main(int ac, char **av) { 
    FILE *input; 
    int i; 

    input = fopen("INPUTFILE.TXT", "r"); 
    if(!input) { 
     printf("No input file\n"); 
     return 1; 
    } 
    if(fscanf(input, "%d", &i) == 1) 
     printf("Answer: %d\n", i); 
    else 
     printf("No answer\n"); 
    return 0; 
} 

注意,你已經打開了新的輸入文件,並使用所產生的手柄在後續調用。另請注意,您必須使用稍微不同的呼叫才能從指定的句柄而不是stdin中讀取。例如,您必須使用fscanf而不是scanf,getc而不是getcharfgets而不是gets