Поменять местами первую и последнюю записи в файле

  • Автор темы AILEKCAHdP
  • Дата начала
A

AILEKCAHdP

#1
Структура имеет вид: номер читательского билета, автор книги, название, дата заказа. Вывести на экран содержимое файла. Поменять местами первую и последнюю записи в файле.*

* При обмене введите промежуточную переменную типа структура.

C++:
 /*
Структура имеет вид: номер читательского билета, 
автор книги, название, дата заказа. Вывести на экран 
содержимое файла. Поменять местами первую и последнюю 
записи в файле.*
*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include "locale.h"

struct book
{
char name[10];
char nazv[10];
char data[10];
char number[10];
}bk;
void input();
void print();
void app();
void findbook();
//void smena();

int main()
{ 
char c = 'a';
setlocale(LC_ALL,"Russian");
while (c!='0')
{
puts("1-новый файл");
puts("2-просмотр файла");
puts("3-добавление в файл");
puts("4-поиск и изменение");
puts("5-смена книги");
puts("0-выход");
c = getch();
switch(c)
{
case '1':input(); break;
case '2':print();break;
case '3':app();break;
case '4':findbook();break;
// case '5':smena();break;
case '0':break;
default : puts("неверный режим");
}
}
}

void input()
{
char ch;
int res=0;
FILE *tf=fopen("file1.dat","wb");
printf("\n Введите информацию о книге \n");
do
{ 
printf("\n Номер читательского билета: "); 
scanf("%s",bk.number);
printf(" Автор книги: "); 
scanf("%s",&bk.name);
printf(" Название: "); 
scanf("%s",&bk.nazv);
printf(" Дата заказа: "); 
scanf("%s",&bk.data);
res = fwrite(&bk,sizeof(bk),1,tf);
printf("\n Закончить ? y/n \n");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}

void app()
{
char ch;
FILE *tf=fopen("file1.dat","ab");
printf("\n Введите информацию о книге \n");
do
{ 
printf("\n Номер читательского билета: "); 
scanf("%s",bk.number);
printf(" Автор книги: "); 
scanf("%s",&bk.name);
printf(" Название: "); 
scanf("%s",&bk.nazv);
printf(" Дата заказа: "); 
scanf("%s",&bk.data);
fwrite(&bk,sizeof(bk),1,tf);
printf("\n Закончить ? y/n \n");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}


void print()
{ 
int n; 
FILE *tf=fopen("file1.dat","rb");
n=1;
fread(&bk,sizeof(bk),1,tf);
printf("\n \tНомер \tАвтор \tНазвание \tДата \n");
while(!feof(tf))
{
printf("\n%d \t%s \t%s \t%s \t%10s ",n,bk.number,bk.name,bk.nazv,bk.data);
fread(&bk,sizeof(bk),1,tf);
n++;
}
getch();
printf("\n");
fclose(tf);
}

void findbook()
{
char c, BOOK[10];
long int i;
FILE *tf=fopen("file1.dat","rb+");
puts(" Введите автора книги: ");
gets(BOOK);
fread(&bk,sizeof(bk),1,tf);
while (!feof(tf))
{
if (strcmp(bk.name,BOOK)==0)
{
printf(" Номер %10s Автор %6s Название %s Дата %6s",bk.number,bk.name,bk.nazv,bk.data);
printf("\n Изменить ? y/n \n");
c=getch();
if (c=='y')
{
printf("\n Автор: "); 
scanf("%s",&bk.name);
printf("\n Номер: "); 
scanf("%s",&bk.number);
i=sizeof(bk);
fseek(tf,-i,1);
fwrite(&bk,sizeof(bk),1,tf);
break;
}
}
fread(&bk,sizeof(bk),1,tf);
}
fclose(tf);
}


/* void smena()
{  
int n;		
struct book read[n];
FILE *tf=fopen("file1.dat","rb+");
fread(&read, sizeof(bk),2, tf);
fseek(tf,0,SEEK_SET);
fwrite(&read[n-1],sizeof(bk), 1, tf);
fwrite(&read[0],sizeof(bk), 1, tf);
fclose(tf);
}
*/
Все функции работают , а вот как поменять местами не могу сделать.
Эту функцию я закомментировал -> void smena()
 
R

RiCrO

#2
Если я понял условие, то тебе необходимы указатели на первый и последний элемент \ запись файла. Создаёшь цикл пробега по элементам файла и запоминаешь последний. После этого меняешь местами первый и последний.