Тандартне введеннЯ/виведеннЯ
Џри запуску будь-Яко» програми автоматично вґдкриваютьсЯ вґдразу три файла:
- файл стандартного вводу. ‰ого вказґвник назива№тьсЯ stdin;
- файл стандартного виводу. ‰ого вказґвник назива№тьсЯ stdout;
- файл стандартного виводу помилок. ‰ого вказґвник назива№тьсЯ stderr.
Џри роботґ з файлами ми можемо використовувати цґ вказґвники, щоб направлЯти данґ в стандартнґ потоки, в Яких за замовчуваннЯм введеннЯ йде з клавґатури, а виведеннЯ - на екран. Ќаприклад, щоб ввести рЯдок з клавґатури, можна застосувати функцґю fgets () у виглЯдґ:
fgets(s, maxline, stdin);
а длЯ виведеннЯ рЯдка на экран С функцию fputs() у виглЯдґ:
fputs(s, stdout);
‡ наведеного ранґше перелґку функцґй, обслуговуючих введеннЯ/виведеннЯ, ми бачили, що ґснують функцґ» getc (fp), putc (c, fp), Якґ вґдповґдно вводЯть один символ з файлу з вказґвником fp ґ пишуть один символ в файл з вказґвником fp. џкщо замґсть вказґвника fp, Який ма№ тип FILE, в цґ функцґ» помґстити вказґвники стандартного потоку, то вони стануть вґдповґдно вводити один символ з клавґатури ґ виводити його на екран. ‚иЯвлЯ№тьсЯ, що ранґше застосовуванґ нами в прикладах функцґ» getchar (), putchar () пов'Язанґ в файлґ stdio.h зґ стандартними потоками наступним чином:
#define getchar() getc(stdin)
#define putchar() putc(stdout)
’ому, пґдключивши файл stdio.h до сво№» програми, ми спокґйно працювали з цими функцґЯми, а фактично - з символьними константами.
“ мовґ ‘ стандартний ввґд можна перенаправлЯти на введеннЯ з файлу (ранґше ми бачили, що це може робити функцґЯ freopen ()): Якщо деЯка програма з ґм'Ям p1.exe використову№ функцґю getchar (), то за допомогою виконаннЯ командного рЯдка:
p1.exe < anyFILE1
ми отрима№мо введеннЯ не з клавґатури, а з файлу anyFILE1. Љомандний рЯдок в ‘ можна виконати за допомогою системно» функцґ» system () у виглЯдґ:
system("P1.EXE < ANYFILE1");
Џричому символи повиннґ бути в верхньому регґстрґ, так Як викону№тьсЯ команда DOS. ’очно так само, Як ґ длЯ введеннЯ, можна перенаправити стандартний вивґд у файл. џкщо ма№мо програму p2.exe, Яка використову№ стандартне виведеннЯ, то за допомогою виконаннЯ командного рЯдка:
p2.exe > anyFILE2
ми отрима№мо виведеннЯ у файл anyFILE2.
Риклади програм перенаправленнЯ введеннЯ/виведеннЯ
Ќаведемо приклади програм перенаправленнЯ введеннЯ/виведеннЯ. ’аких програм буде двґ: одна - викликане, в Якґй буде вґдбуватисЯ стандартний ввґд / вивґд, а друга - зухвала, Яка буде запускати першу з перенаправленнЯм вводу / виводу.
‚иклика№тьсЯ програма, Яка вводить данґ з клавґатури ґ виводить результат на екран, приведена в лґстингу 3.
Истинг 3
//--------------------------------------------------------------------
# pragma hdrstop
# include <stdio.h>
# include <conio.h>
# define eof 10
/* ’ут введено ознака кґнцЯ файлу: код 10 через правий <Alt> +10 на правґй клавґатурґ. Љод 27 (клавґша <Esc>) вводити не можна: Якщо застосувати зухвалу програму, Яка за допомогою функцґ» system () буде перенаправлЯти ввґд / вивґд, то зухвала програма, зависне. Љодом 10 (натисканнЯм <Enter>) треба завершувати файл, з Якого будуть братисЯ данґ длЯ введеннЯ, виходЯчи ґз специфґки роботи функцґ» getchar () */
# define no 0
# define yes 1
// ------------------------------------------------ --------------------
int main () {
int i = 0;
char m [1000];
/* Џґдрахунок кґлькостґ символґв, слґв ґ рЯдкґв, введених з клавґатури */
int c;
int nc, nl, nw, in;
nc = nl = nw = 0;
in = no;
while ((c = getchar ())! = eof)
/* EOF визначений у бґблґотецґ stdio.h Як # define EOF -1 */ {
m [i] = c;
i++;
m [i] = '\0';
nc++;
if (c == '\ n')
nl + +;
if (c == '' || c == '\n' || c == '\t')
in = no; // перебува№мо поза слова
else if (in == no) // потраплЯ№мо в слово ґ зарахову№мо його {
in = yes;
nw + +;
}
} // While
printf ("Entered from FILE =% s \ n", m);
printf ("Strings .... =%d \n", nl);
printf ("Words ...... =%d \n", nw);
printf ("Charecters. =%d \n", nc);
getch ();
}
‚икликаюча програма, що перенаправлЯ№ стандартне введеннЯ/виведеннЯ, наведена у лґстингу 4.
Истинг 4
/ / ------------------------------------------------ --------------------
# include <stdio.h>
# include <stdlib.h> // длЯ system ()
# include <conio.h> // длЯ getch ()
# pragma hdrstop
/ / ------------------------------------------------ --------------------
# pragma argsused
int main (int argc, char * argv []) {
/* Џрограма PROJECT3_INPOUTREDIRECT.EXE почне виконуватисЯ ґ вводити данґ з файлу PEREVIRKA.TXT */
system ("PROJECT3_INPOUTREDIRECT.EXE < PEREVIRKA.TXT");
/* Џрограма PROJECT3_INPOUTREDIRECT.EXE почне виконуватисЯ ґ виводити результати в файл PEREVIRKA1.TXT. ’ут введеннЯ очґкуватиметьсЯ з клавґатури, оскґльки перенаправленнЯ вводу дґЯло тґльки в межах першого виконаннЯ функцґ» system () */
system ("PROJECT3_INPOUTREDIRECT.EXE> PEREVIRKA1.TXT");
getch ();
}
ђезультат роботи програми показаний на рис. 1.
ђис. 1. ђезультат роботи програми по перенаправленню введеннЯ/виведеннЯ