Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Лабораторная работа № 3. Работа с файлами на языке С



Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое. Каждый файл завершается маркером конца файла (end-of-file marker или EOF) или указанным числом байтов, записанным в служебную структуру данных.

Задание Краткие теоретические сведения
1. Выполнить программу, записанную в данном пункте. Дополнить программу операторами считывания файла и вывода на экран его содержимого.   Пример программы на языке С, которая открывает файл а.txt на диске f, записывает в него строку символов (слово «привет») и закрывает файл. Файл открывается с помощью fopen. Здесь "w"означает, что файл открывается для записи и, если он существует, то содержимое файла стирается. Если файл не открывается, то в программе выдается сообщение. Функция fwrite записывает содержимое переменной stдлинойstrlen(st), fp- указатель на файл, в который производится запись. Файл закрывается с помощью функции fclose.
2. Выполнить программу, записанную в правой части. Изменить программу так, чтобы выводились на экран все предложения с 1 по n.   Пример. Пусть в текстовом файле “b.txt” на диске f записано несколько предложений. Конец предложения обозначен точкой. Ввести номер предложения n и вывести из текстового файла на экран предложение с этим номером. В программе на языке С открывается файл, с помощью функции fseekустанавливается текущая позиция в файле на конец и функцией ftellопределяется размер содержимого файла. Далее с помощью функции fseekустанавливается текущая позиция в файле на начало и происходит чтение информации функцией fread и поиск точки.    
3. Опробовать программму, записанную в правой части, с различными режимами работы. Записать условие задачи.
#include <conio.h> #include <io.h> #include <iostream> typedef struct studios { char fio[16]; char gruppa[7]; } STUDIOS; typedef struct hasht { int pos; } HASHT; HASHT HT1[256*2], HT2[256*2]; int num; FILE *f,*h1,*h2; void Vvod(); void Vyvod(); void Poisk(); void Klav(); void Zg(); int H(char *); int aconv(char); void UpDate(); int main (int key) { setlocale(LC_ALL, "Russian"); int choice; f = fopen("base.bin", "ab"); if(filelength(fileno(f)) == 0) key = 1; else key = 0; fclose(f); printf("1.Ввод данных\n"); printf("2.Вывод данных\n"); printf("3.Поиск\n"); printf("0.Выход из программы\n\n"); printf("Введите номер операции: "); scanf("%d",&choice); switch(choice) { case 1: printf("Введите колич. студентов: "); scanf("%d", &num); Vvod(); Klav(); main(0); break; case 2: if (key) { printf("Данные отсутствуют"); Klav(); main(1); } else { Vyvod(); Klav(); main(0); break; } case 3: if (key) { printf("Данные отсутствуют"); Klav(); main(1); } else { Poisk(); Klav(); main(0); } break; case 0: fclose(f); exit(0); break; default: { printf("Неверный ввод. Нажмите клавишу"); fflush(stdin); getch(); if(key) main(1); else main(0); } } }
void Vvod() { STUDIOS buf = {' ', ' '}; int point, i = 0, value, data = 0; if (num<1) main(1); for(point = 0; point<num; point++) { f = fopen("base.bin", "ab"); fflush(stdin); printf("Введите данные для %d студента\n\n", point+1); printf("Введите фамилию: "); gets(buf.fio); printf("Введите группу: "); gets(buf.gruppa); data = filelength(fileno(f)); if(data == 0) data = -1; fwrite(&buf, sizeof(buf), 1, f); fclose(f); i = 0; value = H(buf.fio); if(HT1[value].pos!= 0) {while(HT1[value+i].pos!= 0) i += 256; HT1[value+i].pos = data;} else HT1[value].pos = data; i = 0; value = H(buf.gruppa); if(HT2[value].pos!= 0) { while(HT2[value+i].pos!= 0) i += 256; HT2[value+i].pos = data; } else HT2[value].pos = data; } } void Vyvod() { STUDIOS buf; F = fopen("base.bin", "rb"); Zg(); fread(&buf, sizeof(buf), 1, f); while(!feof(f)) { printf("¦%-18s¦%-7s¦\n", buf.fio, buf.gruppa); fread(&buf, sizeof(buf), 1, f); } printf("+--------------------------+\n"); fclose(f); } void Poisk() { int number, choice, pos, i=0; char STR[25]; STUDIOS buf; printf("1.Поиск по фамилии\n"); printf("2.Поиск по группе\n"); printf("Введите номер операции:"); fflush(stdin);//очистка буфера перед вызовом scanf() scanf("%d",&choice); fflush(stdin); f=fopen("base.bin","rb"); switch(choice) { case 1: printf("Введите фамилию:"); gets(STR); number = H(STR); while(HT1[number+i].pos!= 0) { if(i == 0) Zg(); pos = HT1[number+i].pos; if(pos == -1) pos = 0; fseek(f, pos, SEEK_SET); fread(&buf, sizeof(buf), 1, f); if(strcmp(STR, buf.fio) == 0)// сравнение строк printf("¦%-18s¦%-7s¦\n", buf.fio, buf.gruppa); i += 256; } fclose(f); if(i==0) {printf("Ничего не найдено\n"); getch();main(0);} printf("+--------------------------+\n"); break; case 2: printf("Введите группу:"); gets(STR); number = H(STR); while(HT2[number+i].pos!= 0) { if(i == 0) Zg(); pos = HT2[number+i].pos; if(pos == -1) pos = 0; fseek(f, pos, SEEK_SET); fread(&buf, sizeof(buf), 1, f); if(strcmp(STR, buf.gruppa)== 0) printf("¦%-18s¦%-7s¦\n", buf.fio, buf.gruppa); i += 256; } fclose(f); if(i == 0) {printf("Ничего не найдено"); getch(); main(0); } printf("+-------------------------+\n"); break; } }
int H(char *s) { int i, sum; char c; sum=0; for(i = 0; s[i]!= '\0'; i++) { c = s[i]; sum = sum + aconv(c); } return (sum%256); } int aconv(char c) // isascii - проверка на символ из набора ASCII // toascii - конвертация символа в код набора ASCII { if(isascii(c)) return toascii(c); return (toascii(c) + 128); } void Zg() {printf("+--------------------------+\n"); printf("¦%-18s¦%-7s¦\n","Фамилия","Группа"); printf("¦------------------+-------+\n");} void Klav() { printf("Нажмите любую клавишу.\n"); getch(); }

4. В соответствии со своим вариантом разработать программу для работы с файлами на языке С. В задании использовать бинарные файлы (с расширением bin).

№ варианта Условие задачи
  Даны два файла вещественных чисел с именами A и B, содержащие элементы прямоугольных матриц M1 и M2 (по строкам), причем начальный элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем C, содержащий произведение M1·M2. Если матрицы M1 и M2 нельзя перемножать, то оставить файл C пустым.
  Даны два файла вещественных чисел с именами A и B, содержащие элементы прямоугольных матриц M1 и M2 (по строкам), причем начальный элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем C, содержащий сумму M1+M2.
  Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам), причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий матрицу, транспонированную к исходной.
  Дан файл целых чисел с элементами A(i), i = 0,..., N–1 (N - размер файла). Заменить исходное расположение его элементов на следующее: A(0), A(N–1), A(1), A(N–2), A(2),....
  Компоненты файла A– целые (отличные от нуля) числа, причем из них первые 10 положительных чисел, затем 10 отрицательных, и т.д. Получить файл B, в котором записаны сначала 5 положительных чисел, затем 5 отрицательных и т.д.
  Даны три файла целых чисел одинакового размера с именами A, B и C. Создать новый файл с именем D, в котором чередовались бы элементы исходных файлов с одним и тем же номером: a0, b0, c0, a1, b1, c1, a2, b2, c2,....
  Компоненты файла A – вещественные числа (положительные и отрицательные). Определить и вывести на экран порядковый номер того из них, которое наиболее близко к введенному пользователем целому числу.
  Компоненты файла A – целые числа, значения которых повторяются. Получить файл B, образованный из A числами, которые встречаются в A ровно 2 раза.
  Компоненты файла A– целые числа, значения которых повторяются. Получить файл B, образованный из A исключением повторных вхождений одного и того же числа.
  Компоненты файла A – целые (отличные от нуля) числа: х, y1,... yn. Вывести на экран два члена этой последовательности, среднее арифметическое которых ближе всего к х.
  Компоненты файла A – целые (отличные от нуля) числа, причем положительных чисел столько же, сколько отрицательных. Получить файл B, в котором не было бы двух соседних чисел с одинаковым знаком (сохранить порядок следования чисел).
  Компоненты файла A – целые числа, значения которых повторяются. Получить файл B, образованный из A числами, которые встречаются в A более 2 раз.
  Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам), причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ую строку исходной матрицы.
  Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам), причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ый столбец исходной матрицы.
  Даны два файла целых чисел с именами A и B. Получить новый файл с именем C, который содержит сумму элементов файлов A и B.  
  Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам), причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ый столбец исходной матрицы.  

В начало практикума


Лабораторная работа № 4. Работа с файлами на языке С++

Для обработки файлов в C++ должны быть включены заголовочные файлы < iostream > и < fstream >, а также следует использовать стандартное пространство имен- using namespace std;

Задание Краткие теоретические сведения
1. В правой части приведен пример программы на языке С++, которая открывает файл (имя которого вместе с расширением нужно ввести с клавиатуры), читает из файла число и возводит его в квадрат. Затем происходит запись результата вычислений в файл. Предварительно надо записать число в исходный файл. Выполнить программу, используя различные имена файлов.
#include <iostream> #include <fstream> using namespace std; double vvodf (ifstream &f,char s[40]) { double a; f.open (s); if (f.fail()) {cout<<"\n Ошибка открытия файла"; exit(1); }//Проверка открытия файла f >> a;//Чтение переменной f.close(); return a; } void vyvodf(ofstream &f, double a, char s[40]) { f.open(s); if (f.fail()) {cout<<"\n Ошибка открытия файла"; exit(1); } f << a;//Запись переменной f.close(); } void main() { setlocale(LC_ALL,"Russian"); double a, b; char str[40]; ifstream f; ofstream f1; cout<<"\n Ввести имя файла для чтения A: \n"; cin>>str; a = vvodf(f, str); cout<<"\n Прочитанное из файла число A="<<a; b = pow(a, 2); cout<<"\n b="<<b; cout<<"\n Ввести имя файла для записи A: \n"; cin >> str; vyvodf(f1, b, str); cout << endl; }
2. Изучить ввод и вывод структур в файл, выполнив программы, записанные в правой части. Проверить, появился ли файл FIRMA.DAT среди файлов проекта.   Если программа должна вводить или выводить такие данные, как структуры или массивы, то можно использовать методы readи write. Пример. Программа слева использует метод write для вывода содержимого структуры с информацией о работнике (фамилия, возраст, зарплата) в файл FIRMA.DAT.         В программе справа используется метод read для чтения из файла информации о служащем.    
3. Выполнить программу, записанную в данном пункте. Проверить правильность работы программы.     Пример. Пусть дано число k и строковый файл на дискеf с именем Name1, содержащий непустые строки. Создать два новых файла: строковый с именем Name2, содержащий последние k символов каждой строки исходного файла (если строка короче k символов, то она сохраняется целиком), и символьный с именем Name3, содержащий k-й символ каждой строки (если строка короче k, то в файл Name3 записывается пробел).      

4. В соответствии со своим вариантом разработать программу для работы с файлами на языке С++. Предварительно создать текстовый файл F1 не менее чем из 10 строк и записать в него информацию.

№ варианта Условие задачи
  Скопировать в файл F2 только четные строки из F1. Подсчитать размер файлов F1 и F2 (в байтах).
  Скопировать в файл F2 только те строки из F1, которые начинаются с буквы «А». Подсчитать количество слов в F2.
  Скопировать из файла F1 в файл F2 строки, начиная с К до К+5. Подсчитать количество гласных букв в файле F2
  Скопировать из файла F1 в файл F2 все строки, которые не содержат цифры. Подсчитать количество строк, которые начинаются на букву «А» в файле F2.
  Скопировать из файла F1 в файл F2 строки, начиная с 4. Подсчитать количество символов в последнем слове F2.
  Скопировать из файла F1 в файл F2 строки, начиная с N до K. Подсчитать количество согласных букв в файле F2.
  Скопировать из файла F1 в файл F2 все строки, которые содержат только одно слово. Найти самое длинное слово в файле F2.
  Скопировать из файла F1 в файл F2 все строки, кроме той строки, в которой больше всего гласных букв. Напечатать номер этой строки.
  Скопировать из файла F1 в файл F2 все строки, начинающиеся на букву «А» и заканчивающиеся на букву «С», расположенные между строками с номерами N1 и N2. Определить количество слов в первой строке файла F2.
  Скопировать из файла F1 в файл F2 все строки, в которых нет слов, совпадающих с первым словом. Определить количество согласных букв в первой строке файла F2.
  Скопировать из файла F1 в файл F2 все строки, которые содержат только одно слово. Найти самое короткое слово в файле F2.
  Скопировать из файла F1 в файл F2 все строки, в которых есть слова, совпадающие с первым словом. Определить количество согласных букв в последней строке файла F2.
  Скопировать из файла F1 в файл F2 все строки, в которых более 2 слов. Определить номер слова, в котором больше всего гласных букв.
  Скопировать из файла F1 в файл F2 все строки, в которых содержится два одинаковых слова. Определить номер слова, в котором больше всего букв «А».
  Скопировать из файла F1 в файл F2 все строки, в которых содержится не менее двух одинаковых слов. Определить номер слова, в котором больше всего цифр.
  Скопировать из файла F1 в файл F2 все строки, в которых есть слова, совпадающие со вторым словом. Определить количество цифр в последней строке файла F2.

В начало практикума





Дата публикования: 2015-02-18; Прочитано: 2457 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...