Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Приклади програм. Приклад 1. У текстовому файлі data.txt записано цілі числа, розділені довільною кількістю будь-яких пробільних символів






Приклад 1. У текстовому файлі data.txt записано цілі числа, розділені довільною кількістю будь-яких пробільних символів, з можливими порож­німи рядками в будь-якому місці файлу. Переписати в новий файл res.sol у форматі чотирибайтових цілих чисел зі знаком тільки ті з чисел, які кратні 3.

Розв’язок.

#include < iostream>
#include < conio.h>

using namespace std;
int main()
{
FILE *fInp, *fOut;
long int m;
char c;
// Існуючий файл відкриваємо для читання
fInp = fopen(" data.txt", " r");
if (fInp == NULL)
cout < < " Error of opening of a input-file" < <
" data.txt\n";
else
{
// Відкриваємо новий файл у бінарному режимі
fOut = fopen(" res.sol", " wb");
if (fOut == NULL)
cout < < " Error of opening of a output-file" < <
" res.sol";
else
{ // Читаємо до кінця файлу по одному
// блоку розміром sizeof(long) і
// пишемо в область пам'яті, де міститься
while(fscanf(fInp, " %d", & m)! = EOF)// змінна m
if (m % 3 == 0)
// Пишемо у файл sizeof(m) байт з адреси & m
fwrite(& m, sizeof(m), 1, fOut);
fclose(fOut); // Закриття результуючого файлу
fclose(fInp); // Закриття вхідного файлу
cout < < " Copying is completed! \n";
}
}
cout < < " Press any key to exit.";
getch();
return 0;
}

Приклад 2. Компонентами файлу data.dbl є дані, записані у форматі типу double. Поміняти місцями ліву і праву половини цього файлу, не використовуючи допоміжний файл. Якщо у файлі непарна кількість чисел, то число, що розміщене в середині файлу, не переміщати.

Розв’язок.

#include < iostream>
#include < conio.h>

using namespace std;
int main()
{
FILE *fInpOut;
long int pLeft, // Позиція в лівій половині файлу
pRight, // Позиція в правій половині файлу
count; // Кількість чисел у файлі
double dL, dR; // Допоміжні змінні
// Відкриваємо існуючий бінарний файл для

fInpOut = fopen(" data.dbl", " r+b"); // читання і запису
if (fInpOut == NULL)
cout < < " Error of opening of a output-file" < <
" data.dbl\n";
else
{ // Встановлюємо покажчик поточної позиції
fseek(fInpOut, 0L, SEEK_END); // на кінець файлу
// Обчислюємо кількість чисел у файлі
count = ftell(fInpOut) / sizeof(double);
//Обчислюємо першу позицію покажчика
// поточної позиції у правій половині файлу
pRight = (count - count / 2) * sizeof(double);
// Як значення параметра циклу - позиція покажчика
// поточної позиції у лівій половині файлу
for (pLeft = 0; pLeft < (count / 2) * sizeof(double);
pLeft += sizeof(double), pRight += sizeof(double))
{ // У циклі по черзі здійснюється встановлення
// покажчика поточної позиції файлу на потрібну
// позицію в лівій і правій половинах файлу зі
// зчитуванням по sizeof(double) байт у змінні dL,
// dR. Надалі знову по черзі виконується встановлення
// покажчика поточної позиції файлу на потрібну
// позицію в його правій і лівій половинах із
// записом у файл умісту змінних dL, dR відповідно
fseek(fInpOut, pLeft, SEEK_SET);
fread(& dL, sizeof(double), 1, fInpOut);
fseek(fInpOut, pRight, SEEK_SET);
fread(& dR, sizeof(double), 1, fInpOut);
fseek(fInpOut, pRight, SEEK_SET);
fwrite(& dL, sizeof(dL), 1, fInpOut);
fseek(fInpOut, pLeft, SEEK_SET);
fwrite(& dR, sizeof(dR), 1, fInpOut);
}
fclose(fInpOut); // Закриття файлу
cout < < " Transformation is veiled! \n";
}
cout < < " Press any key to exit.";
getch();
return 0;
}

Приклад 3. Дано два файли, що містять числа у форматі double. У якому з цих файлів мінімальне значення перебуває ближче до його по­чатку?

Розв’язок.

#include < iostream>
#include < conio.h>
using namespace std;
long int PosMinInFile(FILE * f); // Прототип

int main()
{
FILE *f1, *f2;
long int p1, p2;
char Name1[256], Name2[256];
cout < < " Enter a name of the first file: \n";
cin.getline(Name1, 256);
f1 = fopen(Name1, " rb"); // Відкриваємо перший бінарний
if (! f1) // файл для читання та робимо перевірку
cout < < " Error of opening of a file " < < Name1;
else
{
cout < < " Enter a name of the second file: \n";
cin.getline(Name2, 256);
// Відкриваємо другий бінарний файл для читання
if (! (f2 = fopen(Name2, " rb"))) // та робимо перевірку
cout < < " Error of opening of a file " < < Name2;
else
{
if ((p1 = PosMinInFile(f1)) == -1)
cout < < " File " < < Name1 < < " is empty";
else
{
if ((p2 = PosMinInFile(f2)) == -1)
cout < < " File " < < Name2 < < " is empty";
else
if (p1 < p2)
cout < < " In a file " < < Name1;
else
if (p1 > p2)
cout < < " In a file " < < Name2;
else cout < < " Positions are equal";
}
fclose(f1);
fclose(f2);
}
}
cout < < " \nPress any key to exit.";
getch();
return 0;
}
// Визначення функції
long int PosMinInFile(FILE * f)
{
double Min, d;
long int i = 0, Result = -1;
// Читаємо по одному блоку у sizeof(double) байт, поки
while (fread(& d, sizeof(double), 1, f)) // функція
{ // fread() не поверне значення 0
if (Result == -1 || d < Min)
{
Min = d;
Result = i;
}
i++;
}
return Result;
}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.