BOOK_t book;
std::ofstream x(..........);
...................................
x.write( (char *)&book, sizeof(BOOK_t) );
Копирование в файл и из файла
Как можно реализовать копирование из файла и в файл? Помогите пожалуйста.
// book.cpp
#include "book.h"
#include <iostream>
///////////////////////////////////////////////////
struct KART_t k = {new BOOK_t*[RESERVE],0,RESERVE};
void PrintBOOK(BOOK_t * book) // Печать формы карточки
{
printf("\n%-12s %s\n","Автор",book->author);
// wprintf(L"\n%-12s\n",L"Автор");
printf("%-12s %s\n","Заглавие",book->name);
printf("%-12s %d\n","Год издания",book->year);
printf("%-12s %.2f\n","Цена",book->cost);
printf("%-12s %d\n\n","Категория", book->category);
}
void ScanfBOOK(BOOK_t * book) // Введение данных в форму
{
printf("\n%-12s","Автор");
scanf("%9s",book->author);
fflush(stdin);
printf("%-12s","Заглавие");
scanf("%9s",book->name);
fflush(stdin);
printf("%-12s","Год издания");
scanf("%d",&book->year);
fflush(stdin);
printf("%-12s ","Цена");
scanf("%f",&book->cost);
fflush(stdin);
printf("%-12s ","Категория");
scanf("\n%d",&book->category);
fflush(stdin);
}
int AddBOOK(KART_t * k) //Добавление новой карточки
{
if (!k->cap) //
{
BOOK_t ** tmp_kart = new BOOK_t * [ k->n + RESERVE]; // Динамически выделяем память для новой книги, размер: уже имеющееся кол-во книг + резерв
for (int i =0; i < k->n; i++)
tmp_kart = k->kart;
k->cap = RESERVE;
delete[] k->kart;
k->kart =tmp_kart;
tmp_kart=0;
}
k->kart[k->n] = new BOOK_t;
ScanfBOOK(k->kart[k->n]);
k->n++;
k->cap--;
return 1;
}
int DelBOOK(KART_t * k, int N) //Удаление новой(самой последней) карточки
{
if (N<=k->n)
{
delete k->kart[N];
for (int i = N; i < k->n; i++)
{
k->kart = k->kart[i+1];
}
k->kart[k->n]=0;
k->n--;
k->cap++;
}
else {
std::cout<<"Ошибка!";
return false;
}
return true;
}
void printAll(KART_t * k) //Распечатка картотеки
{
for(int i = 0;i<k->n;i++)
{
PrintBOOK(k->kart);
}
}
int Menu() //Вывод Меню
{
int a;
printf("Печать KART (1)\n");
printf("Ввести новую книгу (2)\n");
printf("Удалить текущую (3)\n");
printf("Копировать в файл (4)\n");
printf("Копировать из файла (5)\n");
scanf("%d",&a);
return a;
//book.h
#define RESERVE 2
struct BOOK_t
{
int year; // год издания
float cost; // цена
int category; // категория
char author[10]; // автор
char name[10]; // заглавие
};
struct KART_t
{
BOOK_t ** kart; // Указатель на массив указателей
int n; // количество книг
int cap; // резерв
};
//Прототипы используемых в данном задании функций:
void PrintBOOK(BOOK_t * );
void ScanfBOOK(BOOK_t * );
int AddBOOK(KART_t * k);
int Menu();
void printAll(KART_t * k);
int DelBOOK(KART_t * k, int N);
//main.cpp
#include <clocale>
#include <tchar.h>
#include <iostream>
#include <cstdio>
#include "book.h"
#define stop __asm nop
void main()
{
setlocale(LC_ALL ,".1251");
KART_t kart={new BOOK_t*[2], 0,2};
int a;
while(true)
{
int n = Menu();
switch(n)
{
case 1 : printAll(&kart);
break;
case 2 : AddBOOK(&kart);
break;
case 3 : {
scanf("Введите номер книги: %d",&a);
DelBOOK(&kart,a);
}
break;
}
}
}
Код:
Считать из файла данные по одной книге можно так:
Код:
BOOK_t book;
std::ifstream x(..........);
...................................
x.read( (char *)&book, sizeof(BOOK_t) );
std::ifstream x(..........);
...................................
x.read( (char *)&book, sizeof(BOOK_t) );
Цитата: Maxik54
Написал такое подобие базы данных со структурами.
Как можно реализовать копирование из файла и в файл? Помогите пожалуйста.
Как можно реализовать копирование из файла и в файл? Помогите пожалуйста.
Вначале замечания.
Код нужно заключать в теги [noparse]
Код:
К тому же приводить его без ошибок, а то закрывающей скобочки не хватает...
Если используете в основном printf, то cout не к месту.
Сохранение в файл делаем примерно так:
Код:
void saveBook(BOOK_t *book, FILE *name)
{
fprintf(name, "%-12s %s\n", "Автор", book->author);
fprintf(name, "%-12s %s\n", "Заглавие", book->name);
fprintf(name, "%-12s %d\n", "Год издания", book->year);
fprintf(name, "%-12s %.2f\n", "Цена", book->cost);
fprintf(name, "%-12s %d\n\n", "Категория", book->category);
}
int saveToFile(KART_t * k)
{
FILE * name;
if ((name = fopen("test.txt", "w")) == NULL)
{
fprintf(stderr, "Error!");
return 1; // error
}
for (int i = 0; i < k->n; i++)
saveBook(k->kart, name);
fclose(name);
return 0; // ok
}
{
fprintf(name, "%-12s %s\n", "Автор", book->author);
fprintf(name, "%-12s %s\n", "Заглавие", book->name);
fprintf(name, "%-12s %d\n", "Год издания", book->year);
fprintf(name, "%-12s %.2f\n", "Цена", book->cost);
fprintf(name, "%-12s %d\n\n", "Категория", book->category);
}
int saveToFile(KART_t * k)
{
FILE * name;
if ((name = fopen("test.txt", "w")) == NULL)
{
fprintf(stderr, "Error!");
return 1; // error
}
for (int i = 0; i < k->n; i++)
saveBook(k->kart, name);
fclose(name);
return 0; // ok
}
В функции main
Код:
...
case 4 : saveToFile(&kart);
break;
...
case 4 : saveToFile(&kart);
break;
...
Т. е. всё практически также, как при выводе на экран.
Чтение из файла делается практически также, как при вводе с клавиатуры, только функция fscanf.
Цитата: koodeer
Вначале замечания.
Код нужно заключать в теги [noparse]
[/noparse].
К тому же приводить его без ошибок, а то закрывающей скобочки не хватает...
Если используете в основном printf, то cout не к месту.
Сохранение в файл делаем примерно так:
В функции main
Т. е. всё практически также, как при выводе на экран.
Чтение из файла делается практически также, как при вводе с клавиатуры, только функция fscanf.
Код нужно заключать в теги [noparse]
Код:
К тому же приводить его без ошибок, а то закрывающей скобочки не хватает...
Если используете в основном printf, то cout не к месту.
Сохранение в файл делаем примерно так:
Код:
void saveBook(BOOK_t *book, FILE *name)
{
fprintf(name, "%-12s %s\n", "Автор", book->author);
fprintf(name, "%-12s %s\n", "Заглавие", book->name);
fprintf(name, "%-12s %d\n", "Год издания", book->year);
fprintf(name, "%-12s %.2f\n", "Цена", book->cost);
fprintf(name, "%-12s %d\n\n", "Категория", book->category);
}
int saveToFile(KART_t * k)
{
FILE * name;
if ((name = fopen("test.txt", "w")) == NULL)
{
fprintf(stderr, "Error!");
return 1; // error
}
for (int i = 0; i < k->n; i++)
saveBook(k->kart, name);
fclose(name);
return 0; // ok
}
{
fprintf(name, "%-12s %s\n", "Автор", book->author);
fprintf(name, "%-12s %s\n", "Заглавие", book->name);
fprintf(name, "%-12s %d\n", "Год издания", book->year);
fprintf(name, "%-12s %.2f\n", "Цена", book->cost);
fprintf(name, "%-12s %d\n\n", "Категория", book->category);
}
int saveToFile(KART_t * k)
{
FILE * name;
if ((name = fopen("test.txt", "w")) == NULL)
{
fprintf(stderr, "Error!");
return 1; // error
}
for (int i = 0; i < k->n; i++)
saveBook(k->kart, name);
fclose(name);
return 0; // ok
}
В функции main
Код:
...
case 4 : saveToFile(&kart);
break;
...
case 4 : saveToFile(&kart);
break;
...
Т. е. всё практически также, как при выводе на экран.
Чтение из файла делается практически также, как при вводе с клавиатуры, только функция fscanf.
Спасибо! Создаваемый файл должен быть в папке проекта так?
Цитата: Maxik54
Создаваемый файл должен быть в папке проекта так?
Да где угодно. Достаточно задать путь: вместо "test.txt" (как в примере выше), например, "subdir\\test.txt".
Как сделать что бы при копировании имени каталога в буфер и последующей его вставке, например в текстовый документ, не добавлялся слэш в конце?
Ну,если вы такой ленивый,то PathRemoveBackslash вам в помощь
Цитата: @pixo $oft
Есть какая-то проблема в том,чтобы этот завершающий слэш удалить?Или хотя бы на его место записать \0?
Ну,если вы такой ленивый,то PathRemoveBackslash вам в помощь
Ну,если вы такой ленивый,то PathRemoveBackslash вам в помощь
Боюсь, что ему ни PathRemoveBackslash, ни что-либо другое не поможет, потому что это, скорее всего, бот. :D