Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab11.doc
Скачиваний:
4
Добавлен:
21.09.2019
Размер:
171.01 Кб
Скачать

4. Стандартні потоки

На додаток до потоків, що створюються викликом fopen, п'ять визначених потоків доступні при кожному запуску програми

Ім'я

Ввід/вивід

Режим

Потік

stdin

ввід

Текстовий

Стандартний ввід

stdout

вивід

Текстовий

Стандартний вивід

stderr

вивід

Текстовий

Стандартна помилка

stdaux

ввід-вивід

Двійковий

допоміжний ввід-вивід

stdprn

вивід

Двійковий

Принтерний вивід

Потоки stdaux і stdprn специфичні для DOS і не використовуються в інших системах.

Потоки stdin і stdout можуть бути перенаправлені DOS, у той час як інші пов'язані з особливими пристроями: stderr - із консоллю (CON:), stdprn - із принтером (PRN:), а stdaux - із допоміжним портом.

Допоміжний порт залежить від конфігурації вашої машини; звичайно це COM1:. Подивитеся в документації вашої DOS про перенаправленні вводу і виводу в командному рядку DOS. Без перенаправлення потоки stdin і stdout пов'язані з консоллю (CON:). Крім того, якщо немає перенаправления, stdin має рядок буфера, а stdout не буферизирується. Інші визначені потоки теж не буферизируються.

Для установки визначеного потоку в режим відмінний від режиму за замовчуванням (наприклад, для установки stdprn у текстовий режим) використовуйте setmode. Ім'я визначеного потоку є константою і ви не можете присвоювати йому значення. Якщо ви хочете зв'язати один із цих потоків із файлом або пристроєм, то використовуйте freopen.

5. Приклад програми роботи з файлами

# include<stdio.h>

// задаємо назву файлу

#define FILENAME “test.dat”

void main()

{

// змінна f — вказівник файлу

FILE *f;

int ch;

// відкриваємо файл FILENAME для читання ("r")

f=fopen(FILENAME,"r");

// перевіряєм, чи такий файл існує

if (f==NULL){

// файл не відкрився — його нема на диску

printf("Cannot open %s\n",FILENAME);

// програма завершує роботу з помилкою №1

return(1);

}

// поки не досягнуто кінця файлу

// читаємо символ з файлу

while((ch=getc(f))!=EOF)

// виводимо його на екран

putchar(ch);

// закриваємо файл

fclose(f);

}

6. Різниця при роботі з файлами у мовах Паскаль та с

В стандартному Паскалі є два типи файлів: текстовий (описується як text) і дані (data, описується як file of <тип>). Послідовність для відкриття, модифікації і закривання файлів майже ідентична для обох типів. Турбо Паскаль має третій тип (нетипований файл), що дуже нагадує двійкові файлові операції, що використовуються в Турбо Сі.

В Сі до файлів звичайно звертаються як до потоку символів (побайтно); для вас текстовий файл від файлу даних в основному відрізняється ознаками - t (текстовий) и b (binary - двійковий), які можуть вказуватися при означенні файлу.

Еквіваленти між двома мовами:

Турбо Паскаль Турбо Сі

----------------------------------------------------------------

var

I :Integer; Int i;

X :Real; float x;

Ch :Char; char ch;

Line :string[80]; char line[80];

myRec :RecType; struct rectype myrec;

buffer :array[1..1024] of char char buffer[1024]

F1 :text; FILE *f1;

F2 :file of RecType; FILE *f2;

F3 :file; FILE *f3;

Assign(<fvar>,<fname>); <fvar>=fopen(<fname>,"r");

Reset (<fvar>); /* або <fvar>=fopen(<fname>,"r+");*/

Reset (<untyped fvar>,<bloksize>); /* або f1=fopen(<fname>,"r+t");*/

/* або f2=fopen(<fname>,"r+b");*/

Assign(<fvar>,<fname>); <fvar>=fopen(<fname>,"w");

Rewrite(<fvar>); /* або<fvar>=fopen(<fname>,"w+");*/

Rewrite(<untyped fvar>,<bloksize>); /* або f1=fopen(<fname>,"w+t");*/

/* або f2=fopen(<fname>,"w+b");*/

Assign(<fvar>,<fname>); <fvar>=fopen(<fname>,"a+";

Append(<text fvar>); /* або <fvar>=fopen(<fname>,"a+t");*/

/* або <fvar>=fopen(<fname>,"a+b");*/

Read(F1,Ch); ch=getc(f1);

Readln (F1,Line); fgets(f1,80,line);

Readln (F1,I,X); fscanf(f1,"%d%f",gi,gx);

Read (F2,MyRec); fread(&myrec,

sizeof(myrec),i,1,f2);

BlockRead(F3,buffer,Sizeof(buffer)); fread (&bufer,1,sizeof(buffer), f3);

Write(F1,Ch); fputc(ch,f1); /*або fprint (f1,"%c",ch);*/

Write(F1,Line); fputs(line,f1); /*або fprint(f1,"%s",line);*/

Write(F1,,,I,X); fprint(f1,"%d%f",i,x);

Writeln(F1,I,X); fprint(f1,"%d%f\n",i,x);

Write(F2,MyRec); fwrite(&myrec, sizeof(myrec),1,f2);

Seek(F2,<rec#>); fseek(f2,<rec#>*sizeof(rectype),0);

Flush(<fvar>); fflush(<fvar>);

Close(<fvar>); fclose(<fvar>);

BlockWrite(F3,buffer,Sizeof(buffer); fwrite(&buffer,1, sizeof(buffer),f3);

Цей короткий приклад програми демонстрирує вивід текстового файлу (ім’я якого вводиться в командному рядку) на екран.

Турбо Паскаль Турбо Сі

----------------------------------------------------------------

program DumpIt; # include<stdio.h>

var main(int argc,char *argv[])

F :Text; {

Ch :Char; FILE *f;

begin int ch;

Assign(F,ParamStr(1));

{SI-}Reset(F);{SI+} f=fopen(argv[1],"r");

if IOResult<>0 then begin if (f==NULL){

Writeln ('Cannot open ',ParamStr(1)); printf("Cannot

open %s\n",argv[1]);

Halt(1); return(1);

end; }

While not EOF(F) do begin

Read(F,Ch); while((ch=getc(f))!=DCF)

Write (Ch) putchar(ch);

end;

Close (F) fclose(f);

end. }

-----------------------------------------------------------------

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]