Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

V; // объем выполненных работ




Float cena, //расценки на единицу продукции

Plat; //заработок

};

struct Smeta base[record]; //массив записей

fread(&n,sizeof(n),1,fp); // чтение из файла fp значения n

// чтение из файла fp n структур и размещение в памяти по адресу base

fread(base,sizeof(base[0]),n,fp);

 

Прототип функции fwrite:

size_t fwrite (const void *p, size_t size, size_t, FILE *);

Функция записывает n элементов длиной size байтов из буфера, заданного указателем p, в поток f. Возвращает число записанных элементов.

Примеры обращения:

fwrite(&n,sizeof(n),1,fp);

fwrite(base,sizeof(base[0]),n,fp);

 

1.3.5. Функции чтения символа из потока (getс, fgetс, getchar)

Функция getс, имеющая прототип:

int getc (FILE *f);

возвращает очередной символ в формате int из потока f. Если символ не может быть прочитан, то возвращает значение EOF.

Функция fgetс, имеющая прототип:

int fgetc (FILE *f);

возвращает очередной символ в формате int из потока f. Если символ не может быть прочитан, то возвращает значение EOF.

Функция getchar, имеющая прототип:

int getchar (void);

возвращает очередной символ в формате int из стандартного потока (stdin). Если символ не может быть прочитан, то возвращает значение EOF.

 

1.3.6. Функции записи символа в поток (putc, fputc, putchar)

Функция puts записывает символ ch в поток f. При ошибке возвращает значение EOF. Ее прототип:

int putc (int ch, FILE *f);

Выполняется аналогично функция fputc. Ее прототип:

int fputc (int ch, FILE *f);

 

Функция putchar выводит символ ch на стандартное устройство вывода, добавляя в конце символ новой строки. Возвращает неотрицательноу значение при успехе или EOF – при ошибке.

 

 

1.3.7. Функции чтения строки из потока (fgets, gets)

Прототип функции fgets:

char *fgets (char *s, int n, FILE *f);

Функция читает не более n-1 байт из потока f в строку s, прекращая чтение при обнаружении символа новой строки или конца файла. Символ новой строки при чтении не отбрасывается, помещается конец строки s. Прочитанная строка дополняется ограничителем строки ('\0'). При обнаружении ошибки или конца файла возвращает NULL, в противном случае – указатель на строку s.

Функция читает символы с клавиатуры до появления символа новой строки и помещает их в строку s. Сам символ новой строки в строку не включается. Возвращает указатель на s. Прототип функции gets:

char *gets (char *s);

 

1.3.8. Функции записи строки в поток (fputs, puts)

Прототип функции fputs:

int fputs (const char * s, FILE *f);

Функция fputs записывает строку символов s в поток f. Символ конца строки в файл не записывается. При ошибке возвращает значение EOF, иначе – неотрицательное число.

Функция puts выводит строку s на стандартное устройство вывода, добавляя в конце символ новой строки. Возвращает неотрицательное значение при успехе или EOF – при ошибке. Прототип функции puts:

int puts (char *s);

 

1.3.9. Функции форматированного ввода из потока (fscanf, scanf, sscanf)

 

Прототип функции fscanf:

intfscanf (FILE *f, const char *fmt [, par1, par2, …]);

Эта функция вводит (читает) строку параметров par1, par2, … в формате, определенном строкой fmt, из файла f. Возвращает число переменных, которым присвоено значение.

Прототип функции scanf:

intscanf (const char *fmt [, par1, par2, …]);

Функция scanf вводит (читает) строку параметров par1, par2, … в формате, определенном строкой fmt, со стандартного устройства ввода (обычно с клавиатуры (stdin)). Возвращает число переменных, которым присвоено значение.

Прототип функции sscanf:

intsscanf (const char *buf, const char *fmt [, par1, par2, …]);

Функция sscanf вводит данные аналогично функции scanf, но не с клавиатуры, а из строки символов, переданной ей первым параметром. Аргумент buf – строка символов, из которой вводятся значения, fmt - строка формата, в соответствии с которой происходит преобразование данных. Многоточие указывает на наличие необязательных аргументов, соответствующих адресам вводимых значений.

 

1.3.10. Функции форматированного вывода в поток (fprintf, printf, sprintf)

 

Прототип функции fprintf:

int fprintf (FILE *f, const char *fmt, );

Функция записывает в поток f переменные, список которых обозначен многоточием (), в формате, указанном строкой fmt. Возвращает число записанных значений.

Прототип функции printf:

int printf (const char *fmt, );

Функция выводит на стандартное устройство вывода (stdout) значенияпеременных, перечисленных в списке, обозначенном многоточием (), в формате, определенном строкой fmt. Возвращает число выведенных значений.

Прототип функции sprintf:

int sprintf (char *buf, const char *fmt, );

Функция выводит в строку значения переменных, перечисленных в списке, обозначенном многоточием (), в формате, определенном строкой fmt.

Примечание. Спецификации формата fmt были рассмотрены в разделе "Консольный ввод-вывод".

 

1.4. Обработка ошибок

 

Функции работы с потоками возвращают значения, которые рекомендуется анализировать в программе и обрабатывать ошибочные ситуации, возникающие, например, при открытии файлов или чтении из потока. При работе с файлами часто используют функции feof и ferror.

Прототип функции feof:

int feof (FILE *f);

Функция возвращает EOF или значение, отличное от 0, если достигается конец файла; в противном случае 0.

Прототип функции ferror:

int ferror (FILE *f);

Возвращает не равное нулю целое значение, означающее код ошибки, если обнаружена ошибка ввода/вывода; 0 – в противном случае.


 

1.5. Пример обработки текстового файла

 

В текстовом файле "dbase.txt" хранятся данные о сотрудниках фирмы. В каждой строке файла указана фамилия, год рождения, оклад сотрудника. Для простоты обработки файла данные записаны единообразно: первые 15 символов занимает фамилия, следующие 5 – год рождения, последние 10 – оклад.

Требуется, интерпретируя структурами строки файла, вывести на экран или принтер содержимое файла в виде таблицы, создать из строк файла с данными о сотрудниках файла, моложе 20 лет, массив структур. Вывести на экран или в текстовый файл полученный массив или вывести сообщение о том, что такие молодые сотрудники не работают в фирме.

Структура записи файла изображена на рисунке.

 

Фамилия Год рожден. Оклад

Записи файла могут иметь вид:

 

Иванов И.П. 1982 453120

Авчинникова 1999 578320

Васильков 1955 456780

Чернов 1967 1345600

Требуется на экран, на принтер или в текстовый файл вывести список в форме таблицы. Например:

 

СПИСОК СОТРУДНИКОВ ФИРМЫ

Фамилия Год рожд. Оклад
Иванов И.П.    
Авчинникова    
Васильков    
Чернов    

 

/* Поиск в массиве структур, читаемых из текстового файла */

#include <stdio.h> // с записью рез-тов в новый текстовый файл

#include <string.h>

#include <stdlib.h>

// #include <windows.h>

main()

{

const int lfio=15, //длина поля фио,

lpay=5, // длина поля г.рожд

lo=10, //длина поля оклада

l=lfio+lpay+lo; //длина записи в файле

struct Man

{ char fio[lfio]; // фио

int year; // год рожд.

float pay; // оклад

};

Man db;

char s[l]; //строка для записи файла

FILE *fin, // Исх. файл

*fo,*f1; // Вых. файлы

if ((fin=fopen("dbase.txt", "r"))==NULL)

{puts("Ошибка открытия файла\n");

fflush(stdin); getchar(); return 1;}

puts("Файл открыт");

fo=fopen("dbout.txt","w");

f1=fopen("dbout1.txt","w");

while (!feof(fin))

{ fgets(s,l,fin); puts(s);

strncpy(db.fio,s,lfio-1);

db.fio[lfio-1]='\0';

db.year=atoi(&s[15]);

db.pay=atof(&s[20]);

/*if(db.year>2000)*/

fprintf(fo,"%-15s% %10.1f\n", db.fio, db.pay);

fputs(s,f1);

}

fclose(fin); fclose(fo); fclose(f1);

fflush(stdin); getchar();

return 0;

}

 


1.6. Пример обработки текстового и бинарного файла

/* Построчное считывание данных из текстового файла " dbase.txt " в буферную переменную s, формирование из них структуры db и запись ее в двоичном режиме в выходной файл " dbout.dat ".

Считывание из двоичного файла записи с номером i и вывод ее на экран.

Считывание из двоичного файла записей и вывод на экран только тех записей, для которых фамилия есть " ivanoff ". */

 

Таблица соответствия

 

Идентификатор Тип Комментарий
  lfio const int Длина поля фио
  lpay const int Длина поля г. рожд.
  lo const int Длина поля оклада
  l const int Длина записи
  db Запись Запись
  s строка Строка с содерж. записи
  fin Текстовый файл Исходный текстовый файл
  fo Двоичный файл Двоичный файл, получ. из fin
  kol int Кол-во записей файла fin
  i int Номер записи файла fin


 

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <iostream.h>

main()

{

const int lfio=15,lpay=5,lo=10,//длины полей: фио, г.рожд., оклада в т. файле

l=lfio+lpay+lo; //длина записи в т. файле

struct Man

{ char fio[lfio]; // фио

 

int year; // год рожд.

float pay; // оклад

};

Man db;

char s[l]; //строка для записм файла

FILE *fin, // Исх. файл

*fo; // Вых. файлы

if ((fin=fopen("dbase.txt", "r"))==NULL)

{puts("Ошибка открытия файла\n");

fflush(stdin); getchar(); return 1;}

puts("Файл открыт");

fo=fopen("dbout.dat","w+b");

int kol=0;

while (!feof(fin))

{ fgets(s,l,fin); puts(s);

strncpy(db.fio,s,lfio-1);

db.fio[lfio-1]='\0';

db.year=atoi(&s[15]);

db.pay=atof(&s[20]);

fwrite(&db,sizeof db,1,fo);

kol++;

}

fclose(fin);

int i; printf("Введите номер записи (0-%d)",kol-1);

cin>>i;

if(i>=kol) { cout<<"Запись не существует"; return 1;}

 

fseek(fo,(sizeof db)*i,SEEK_SET);

fread(&db,sizeof db,1,fo);

cout << db.fio << " "<< db.year<<" " << db.pay;

fseek(fo,0,SEEK_SET);

i=0;

while (i<kol)

{ printf("\n");

fread(&db,sizeof db,1,fo);

if(!strcmp(db.fio," ivanoff ")) cout<<"Есть "<<db.fio;

i++;

}

fclose(fo);

fflush(stdin); getchar();

return 0;

}

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...