2011-03-03 61 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