2015-01-10 1 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 и text2.txt, имеющие значение 6.

Когда я даю свой вклад в эта программа использует перенаправление командной строки (как redirection<text1.txt), она дает выход 64 и не ждет, чтобы сделать еще один вход (и выходы программы), который я хочу дать еще один вход из text2.txt.

Есть ли какое-либо решение, как я могу отправить другой ввод через text2.txt для второй функции scanf в вышеуказанной программе?

+4

использовать pipe 'cat text1.txt text2.txt | redirection' – BLUEPIXY

+0

Спасибо ... команда cat работала. есть ли подобная команда в MS DOS? –

+0

'type text1.txt text2.txt 2> nul | redirection' – 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

Вы могли бы лучше упаковать код open/read/close в функцию и вызов этой функции в цикл, не так ли? С обобщением для N аргументов вместо того, чтобы требовать (и проверять) ровно 2 аргумента. –

+0

Это правда, спасибо за ваше предложение. Поскольку он определен относительно количества файлов, которое должно решить это решение. –

+0

Это немного скудно при проверке ошибок ('argc' должен быть проверен перед использованием элементов' argv', значение 'fp' должно быть проверено перед чтением), но оно выглядит лучше. Если вам не нравятся изменения, которые я сделал, вы можете вернуться, но передача массива и индекса функции, а не только элемента массива, не является очевидным выбором. –

Смежные вопросы