Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Ввод - вывод записей

Функции С++ позволяют обмен данными с файлами последовательной и прямой организации, состоящими из записей фиксированной длины. При этом за одно выполнение одной функции в.в данных записями пересылаются одна и более записей. Запись представляется в виде одной переменной любого типа, кроме файлового. Переменная запись определяется программистом. При в/в данных записями надо использовать бинарные режимы доступа в операторах открытия файлов: wb, rb, ab, ab+.

При чтении записей из файла происходит их ввод в ОП, который производится функцией fread. Прототип функции ввода записей:

int fread (void * DstBuf, unsigned Size, int К, FILE *stream);

Где: DstBuf –по адресу указателя переменной любого типа (записи) в ОП куда помещается запись, прочитанная из файла;

Size – длина записи в байтах, определяется функцией sizeof(тип);

К – количество считываемых записей из файла размером Size;

stream – имя указателя, связанного с файлом для чтения.

Функция fread читает К записей длины Size из входного потока stream и помещает их по адресу DstBuf (структуры). После этого указатель файла, связанный с потоком stream, увеличивается на количество прочитанных байтов = Size * К, и функция fread готова прочесть из файла следующую группу байтов. Чтение из файла происходит от нулевого элемента, до символа конца файла. Функция fread возвращает результат целого типа, который является результатом анализа конца файла:

  1. если результат = 1 (истина) запись считана;

  2. если результат = 0 (ложь) запись не считана, обнаружен конец файла.

Пример:

#include <stdio.h>

#include <iostream>

using namespace std;

FILE * fp;

struct stud

{int nz;

char fio[20];

float rs;} zapst;

char str[80];

char fn[20] = "ffff.dat";

void main ()

{

if (fp = fopen (fn, "rb"))

while(fread(&zapst,sizeof(stud),1,fp))

{

str[0]='\0';

sprintf_s(str," %8d | %10s | %8.2g ",zapst.nz,zapst.fio,zapst.rs);

cout<<str<<'\n';

}

}

Вывод записей из ОП в файл производится функцией fwrite. Прототип фунции:

int fwrite (const void * DstBuf, unsigned Size, int К, FILE *stream);

Назначение формальных параметров функции fwrite аналогично параметрам функции fread. Функция выводит К записей из ОП по адресу переменной DstBuf в файл, связанный с указателем . Указатель файла, связанный с потоком , увеличивается на количество выведенных байтов и устанавливается на позицию с которой можно производить следующий вывод записи в файл или признака конца файла.

Возвращаемое значение:

Целый тип возвращаемого параметра определяет количества записей, реально помещенных в файл. Если это меньше К, то имела место ошибка.

Пример:

FILE * fp;

struct stud

{int nz;

char fio[20];

float rs;} zapst;

fwrite(&zapst,sizeof(stud),1,fp);

Пример представляет весь проект:

#include <stdio.h>

#include <iostream>

using namespace std;

FILE * fp;

struct stud

{int nz;

char fio[20];

float rs;} zapst;

char *sh[3] = {" cbedehia o ctudentax ",

" homep z k | F.I.O | ctepehdia ",

"============================================"};

char str[80];

char fn[20] = "ffff.dat";

void main ()

{

cout <<"bbedite name file: \t "<<fn<<endl;

//cin>> fn;

fp = fopen (fn, "wb");

cout<<"NEW FILE\n";

cout<<"nz:/t ";cin>>zapst.nz;

cout<<"fio:/t ";cin>>zapst.fio;

cout<<"rs:/t ";cin>>zapst.rs;

fwrite(&zapst,sizeof(stud),1,fp);

fclose(fp);

for(int i = 0; i < 3; i++)

cout<<sh[i]<<endl;

if (fp = fopen (fn, "rb"))

while(fread(&zapst,sizeof(stud),1,fp))

{str[0]='\0';

sprintf_s(str," %8d | %10s | %8.2g ",zapst.nz,zapst.fio,zapst.rs);

cout<<str<<'\n';

}

fclose(fp);

cout<<"ADD FILE\n";

if (fp = fopen (fn, "ab"))

{cout<<"ENTER \n";

while (getch() == 13)

{

cout<<"nz:/t ";cin>>zapst.nz;

cout<<"fio:/t ";cin>>zapst.fio;

cout<<"rs:/t ";cin>>zapst.rs;

fwrite(&zapst,sizeof(stud),1,fp);

cout<<"ENTER / ESC \n";

}

}

fclose(fp);

if (fp = fopen (fn, "rb"))

while(fread(&zapst,sizeof(stud),1,fp))

{str[0]='\0';

sprintf_s(str," %8d | %10s | %8.2g ",zapst.nz,zapst.fio,zapst.rs);

cout<<str<<'\n';

}

fclose(fp);

}

Работа с файлом в режимах записи, добавления и чтения через один поток

#include "stdafx.h"

#include <conio.h> //kbhit()

#include <iostream>

using namespace std;

int main(void)

{

FILE * fsio; // FileStreamInputOutput

char fname[13] = "tstfile.txt";

char rbuf[81] = "";

fsio = fopen(fname, "wt");

fprintf(stdout,"Open file %s in regime 'wt'\n", fname);

fprintf(fsio,"Example of work with file;\n");

for (int i = 2; i<17; i++)

fprintf(fsio,"\n%i line.", i);

fclose(fsio);

fsio = fopen(fname, "at");

fprintf(stdout,"Open file %s in regime 'at'\n", fname);

for (int i = 1; i<17; i++)

fprintf(fsio,"\n%i added line.", i);

fclose(fsio);

fsio = fopen(fname, "rt");

fprintf(stdout,"Open file %s in regime 'at'\n", fname);

printf("\nContent of file %s:\n", fname);

while(!feof(fsio))

{

fscanf(fsio,"%s",rbuf);//считывается только очередное слово

fprintf(stdout,"next word: %s\n",rbuf);

while(!kbhit())

{

if (getch()!=27) break;

else

{

puts("\nQuit by ESC...");

fclose(fsio);

return 0;

}

}

}

fclose(fsio);

puts("\nProgram done...");

return 0;

}

Работа с текстовым файлом

#include "stdafx.h"

#include <iostream>

using namespace std;

int main(void)

{

FILE *pfs; //PointerFileStream,

char rbuf[127] = "";

pfs = fopen("dat.txt", "wt");

fputs(strcpy(rbuf,"Example of work with file.\n"), pfs);

fputs(strcpy(rbuf,"Last line of file."), pfs);

puts("Two lines was writed in file dat.txt.");

fclose(pfs);

pfs = fopen("dat.txt", "rt");

puts("\nContent of file 'dat.txt':");

while(!feof(pfs))

{

fgets(rbuf, sizeof(rbuf)-1, pfs);

printf("next line: %s", rbuf);

}

fclose(pfs);

puts("\nProgram done...");

return 0;

}