Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SI.doc
Скачиваний:
30
Добавлен:
23.02.2015
Размер:
2.05 Mб
Скачать

2 Задача

Цель: закрепление на практике работы с функциями прямого доступа к файлу.

В бинарном файле находятся числа. Поменять местами первое отрицательное число с последним числом, находящимся в файле.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//функция для обмена первого отрицательного числа и последнего числа в файле

void swap(int l, int mas[]);

void swap(int l, int mas[])

{

FILE*infile;

// поиск первого отрицательного числа

for(int j=0;j<l;j++)

{

// если такое число найдено, запоминаем и само число и позицию, где оно находится

if (mas[j]<0)

{

buff=j;

first=mas[j];

break;

}

}

// открытие бинарного файла для чтения

if ((infile=fopen("t.txt","rb"))==NULL)

{

// ошибка и выход, если не получается

printf("Can't open file1\n");

return(0);

}

// вывод в консоль первого отрицательного числа printf("The first negativ symbol is:%d\n",first);

fseek(infile,-(1)*sizeof(int),SEEK_END);

// считывание первого отрицательного и последнего числав файле

fread(&last, sizeof(int), 1, infile);

// последний символ в файле

printf("The last symbol is:%d\n",last);

//

rewind(infile);

//

mas[buff]=last;

// открытие файла на запись в бинарном режиме

infile=fopen("t.txt","wb");

// вывод всех чисел без последнего

for(int m=0;m<l-1;m++)

{

fwrite(&mas[m],sizeof(int),1,infile);

printf("%d\n",mas[m]);

}

// вывод первого отрицательного в конце файла

fwrite(&first,sizeof(int),1,infile);

printf("%d\n",first);

// закрытие файла if (fclose(infile)!=0)

fprintf(" Cannot close file \n");

}

intmain()

{

// определение переменных

FILE *infile;

int first, last, buff, l;

intmas[200];

// открытие файла на запись в бинарном режиме

if ((infile=fopen("t.txt","wb"))==NULL)

{

// ошибка и выход, если не получилось

printf("Can't create file\n");

return(0);

}

// ввод количества чисел для ввода

printf("How many numbers would you like to put?\n");

scanf("%d",&l);

for(int k=0; k<l; k++)

{

// считывание числа с клавиатуры для записи

scanf("%d",&mas[k]);

// запись в файл

fwrite(&mas[k], sizeof(int), 1, infile);

}

// закрытие файла

if (fclose(infile)!=0)

fprintf(" Cannot close file \n");

swap(l, mas);

return1;

}

3 Задача

Цель: закрепление на практике работы в функцией fgetpos().

Программа разбора строки “my_name_is_Marina.I_live_in_Kharkov”

# include <stdio.h>

voidmain()

{

// описание переменных

FILE*stream;

// описание значения типа fpos_t, на которое указывает переменнаяpos

fpos_t pos;

char buffer[20]=" ";

if ((stream=fopen("fgetpos.cpp","rb"))==NULL)

// если невозможно открыть файл (проверка при открытии файла)

printf("Trouble opening file\n");

else

{

// считываем 10 символов с текущей позиции курсора

fread(buffer, sizeof(char),10,stream);

// выводим считанные символы в консоль

printf("%10s\n",buffer);

// запоминаем позицию курсора и выводим ошибку если не получилось запомнить

if (fgetpos(stream,&pos) != 0)

perror("fsetpos error");

else

// считываем еще 10 символов

fread(buffer, sizeof(char),10,stream);

// вывод номер позиции курсора в файле

printf("10 bytes at byte %ld \n",pos);

// вывод считанной строки

printf("string%10s\n",buffer);

}

// устанавливаем переменную позиции

pos= 20;

// устанавливаем позицию курсора в файл

if (fsetpos(stream,&pos)!=0)

// ошибка, если не получилось

perror ("fsetpos error");

// считываем 10 символов с новой позиции

fread(buffer, sizeof(char),10,stream);

// выводим номер позиции

printf("10bytesatbyte%ld\n",pos);

// и считанную строку

printf("string %10s\n",buffer);

// закрытие файла

if (fclose(stream)!=0)

fprintf(" Cannot close file \n");

}

Комментарий:

Функции fgetpos() иfsetpos() позволют работать с файлами очень больших размеров, что было невозможно при работе с функциямиfseek()и ftell() у которых, длина ограничивалась значение типаlong.

perror() - преобразует значение глобальной переменной в строку и записывает эту строку в поток ошибок.

Самостоятельная работа.

Изменить 1 задачу таким образом, чтобы обмен осуществлялся между максимальным и минимальным значениями (числа хранятся в бинарном файле).

Лабораторная работа №13

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