- •Лабораторна робота №11 (2 год.) Робота з файлами. Файлові потоки.
- •Теоретичні відомості
- •2. Потоки як узагальнені фільтри
- •Приклад 1. Простий приклад потокового вводу-виводу
- •3. Введення-виведення типів char I char*
- •4. Введення-виведення типів int I long
- •5. Введення-виведення типів float I double
- •6. Введення-виведення класів користувача
- •Приклад 3. Ввід-вивід класу користувача
- •7. Маніпулятори
- •8. Використання текстових файлів для введення
- •Приклад 4. Читання і перевірка файлу на помилки
- •9.Виведення текстових файлів
- •10. Читання бінарних файлів
- •Приклад 6. Читання текстового файлу в бінарному режимі
- •11. Запис у бінарні файли
- •12. Копіювання файлів
- •1. Потоки і потік введення - виведення
- •2. Текстові і двійкові потоки
- •3. Буферизація потоків
- •4. Стандартні потоки
- •5. Приклад програми роботи з файлами
- •6. Різниця при роботі з файлами у мовах Паскаль та с
- •Завдання
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. }
-----------------------------------------------------------------