2015-01-10 48 views
1

如何在c程序中重定向多個文本文件?例如我有以下的C代碼:如何在c程序中重定向多個文本文件

//redirection.c 
#include<stdio.h> 
main() 
{ 
int x,y; 
scanf("%d",&x); 
x=x*x; 
printf("%d",x); 

scanf("%d",&y); 
y=x+y; 
printf("%d",y); 
} 

編譯該代碼我創建兩個文本文件text1.txt具有值8和具有值6

text2.txt當我給輸入到後這個程序使用命令行重定向(如redirection<text1.txt),它給出輸出64,並且不等待接受另一個輸入(和程序退出),我想從text2.txt給出另一個輸入。

是否有任何解決方案如何通過text2.txt發送另一個輸入用於上述程序中的第二個scanf函數?

+4

use pipe'cat text1.txt text2.txt |重定向' – BLUEPIXY

+0

謝謝...貓命令工作。 MS DOS中是否還有類似的命令? –

+0

'type text1.txt text2.txt 2> nul |重定向' – BLUEPIXY

回答

3

同時給予輸入作爲重定向像這樣。

cat a b | ./a.out. 

或者你可以使用命令行參數。

#include<stdio.h> 
main(int argc, char *argv[]) 
{ 
    FILE *fp, *fp1; 
    if ((fp=fopen(argv[1],"r")) == NULL){ 
      printf("file cannot be opened\n"); 
      return 1; 
    } 
    if ((fp1=fopen(argv[2],"r")) == NULL){ 
    printf("file cannot be opened\n"); 
      return 1; 
    } 
    int x,y; 
    fscanf(fp,"%d",&x);// If you having only the value in that file 
    x=x*x; 
    printf("%d\n",x); 
    fscanf(fp1,"%d",&y);// If you having only the value in that file          
    y=x+y; 
    printf("%d\n",y); 

} 
1

您還可以使用命令行參數:

#include <stdio.h> 

#define BUFSIZE 1000 

int main(int argc, char *argv[]) 
{ 
    FILE *fp1 = NULL, *fp2 = NULL; 
    char buff1[BUFSIZE], buff2[BUFSIZE]; 

    fp1 = fopen(argv[1], "r"); 
    while (fgets(buff1, BUFSIZE - 1, fp1) != NULL) 
    { 
     printf("%s\n", buff1); 
    } 
    fclose(fp1); 

    fp2 = fopen(argv[2], "r"); 
    while (fgets(buff2, BUFSIZE - 1, fp2) != NULL) 
    { 
     printf("%s\n", buff2); 
    } 
    fclose(fp2); 
} 

這裏是一個更加清理版本:

#include <stdio.h> 

#define BUFSIZE 1000 
void print_content(char *file); 
int main(int argc, char *argv[]) 
{ 
    print_content(argv[1]); 
    print_content(argv[2]); 
} 

void print_content(char *file){ 
    char buff[BUFSIZE]; 
    FILE *fp = fopen(file, "r"); 

    while (fgets(buff, sizeof(buff), fp) != NULL) 
    { 
     printf("%s\n", buff); 
    } 
    fclose(fp); 
} 
+0

你可以更好地將打開/讀取/關閉代碼封裝到一個函數中,並將該函數調用成一個循環,不是嗎?通過N個參數的泛化,而不是要求(和檢查)恰好2個參數。 –

+0

這是真的,謝謝你的建議。由於他具體說明了此解決方案應該執行的文件數量。 –

+0

錯誤檢查有點簡單(在使用'argv'的元素之前應檢查'argc';在讀取之前應檢查'fp'的值),但它看起來更好。如果你不喜歡我所做的編輯,你可以恢復,但傳遞一個數組和索引到函數而不是數組的元素不是明顯的選擇。 –

相關問題