Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
funduk17
40 / 3 / 0
Регистрация: 20.05.2013
Сообщений: 67
#1

Работа с двоичными файлами, организация ввода-вывода структурированной информации/ - C++

09.02.2014, 20:38. Просмотров 461. Ответов 4
Метки нет (Все метки)

Сформировать двоичный файл из элементов, заданной в варианте структуры, распечатать его содержимое, выполнить удаление и добавление элементов в соответствии со своим вариантом, используя для поиска удаляе-мых или добавляемых элементов функцию. Формирование, печать, добавление и удаление элементов оформить в виде функций. Предусмотреть сообщения об ошибках при открытии файла и выполнении операций вво-да/вывода.
12. Структура "Музыкальный диск":
- название;
- автор;
- продолжительность;
- цена.
Удалить первый элемент с заданной продолжительностью, добавить 2 эле-мента после элемента с заданным номером.
Никогда прежде не работал с файлами в СИ, голова кипит, а просто искать информацию по теме и пытаться её понять так сразу не выходит. Прошу помочь, желательно с объяснениями.
Попытка моей работы:
ЗЫ: функция buildingFile не моя, нашёл в подобной работе, но полностью в ней разобраться не смог, по этому обращаюсь к вам.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <stdio.h>
using namespace std;
 
struct music
{
 char name[30];
 char avtor[30];
 double time;
 double price;
};
 
void GetData();
void ShowData();
 
FILE *fp;
char *filename={"ms.txt"};
int arrSize=0;
music ms;
double iTime;
 
void buildingFile() 
{
    if ((fp = fopen( filename, "wb")) == NULL ) 
    {
      cout << "Error writing in file";
        exit (1);
    }
   clrscr();
   char choice;
   do {
      GetData();
      arrSize++;
    cout << "Enter the next one more record? (y/n)";
      cin >> choice;
   } while (choice == 'y');
 
    fclose(fp);
}
 
void GetData(music *M,int n) //ввод
{
 if ((fp = fopen(filename, "ab")) == NULL ) 
 {
 cout << "Error adding file";
 exit (1);
 }
 for(int i=0;i<n;i++)
 {
 cout<<"Name: "; cin>>M[i].name;
 cout<<"Avtor: "; cin>>M[i].avtor;
 cout<<"Time: "; cin>>M[i].time;
 cout<<"Price: "; cin>>M[i].price;
 cout<<endl;
 }     
}
 
void ShowData(music *M,int n) //Вывод
{
 for(int i=0;i<n;i++)
 {
 cout<<M[i].name<<endl;
 cout<<M[i].avtor<<endl;
 cout<<M[i].time<<endl;
 cout<<M[i].price<<endl;
 cout<<endl;
 }     
}
 
int main() //Главная функция
{
 int n; cout<<"Vvedite N: "; cin>>n;
 music *M=new music[n];
 GetData(M,n);
 ShowData(M,n);
 delete [] M;
 system("PAUSE");
 return 0;    
}
Добавлено через 2 часа 11 минут
Тема актуальна!
Смог кое что наработать, подскажите как сделать добавление 2 элемента после элемента с заданным номером? И желательно в структуре использовать не string, а char, что-бы можно было прописывать несколько слов, но тогда возникают сложности!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct music
{
   string name;
   string autor;
   int time;
   int price;
};
void ShowData(music *M, int N)
{
   for (int i = 0; i < N; i++)
    {
     cout << M[i].name << endl;
     cout << M[i].autor << endl;
     cout << M[i].time << endl;
     cout << M[i].price << endl;
     cout << endl;
    }}
void GetData(music *M,int N)
{for (int i=0; i < N; i++)
    {cout << "NAZVANIE: "; cin >> M[i].name;
        cout << "AUTOR: "; cin >> M[i].autor;
       cout << "TIME: "; cin >> M[i].time;
        cout << "PRICE: "; cin >> M[i].price;
        cout << endl;
    }}
void DeleteElem(int itime,music *M, int &N)
{
   for (int i = 0; i < N; i++)
    {if(M[i].time==itime)
         {for (int k = i; k < N-1; k++)//ñäâèã ГўГ±ГҐГµ ýëåìåГ*òîâ Г*Г* îäèГ*
             {M[k].name=M[k+1].name;
                M[k].autor=M[k+1].autor;
                M[k].time=M[k+1].time;
                M[k].price=M[k+1].price; }
             N--; // êîëè÷åñòâî ýëåìåГ*òîâ óìåГ*üøèëîñü
             i--; // Г*Г*äî Г±Г*îâГ* ïðîâåðèòü, Г·ГІГ® òåïåðü Г*Г* i-îì ìåñòå.
         }}}
void StoreData(ofstream &out,music *M, int N)
{for (int i = 0; i < N; i++)
   {out << M[i].name << endl;
     out << M[i].autor << endl;
     out << M[i].time << endl;
     out << M[i].price << endl;
     out << endl;} }
int main()
{int N; cout << "Vvedite  Kollichestvo zapisey: "; cin >> N;
    music *M = new music[N];
    GetData(M, N);
    ofstream out("file.txt");
    StoreData(out,M, N);
    out.close();
    int time=60;
    DeleteElem(time,M,N);
    ShowData(M, N); 
    delete [] M;
    system("PAUSE");
    return 0; 
}
Добавлено через 43 минуты
Неужели никто не может помочь с функцией добавления?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2014, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с двоичными файлами, организация ввода-вывода структурированной информации/ (C++):

Организация файлового ввода/вывода (работа с текстовыми и двоичными файлами) - C++
1(работа с текстовыми файлами) -Дан текстовый файл.Переписать в новый файл все его строки, вставив в конец каждый строки колличество...

Работа с файлами на уровне потокового ввода-вывода с буферизацией. С++ - C++
Всем здравствуйте. Помогите пожалуйста. Необходимо обеспечить выполнение следующих действий: *ввод информации в файл; *корректировка...

Работа с двоичными файлами - C++
Создать файл, состоящий из n вещественных чисел. Вывести на экран все числа данного файла с четными порядковыми номерами, меньшие заданного...

Работа с двоичными файлами - C++
У меня есть кусок программы, который мне нужно переписать: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; #include...

Работа с двоичными файлами - C++
Создать файл,состоящий из n вещественных чисел. Вывести на экран все числа данного файла не попадающие в данный диапазон!!!

Работа с двоичными файлами - C++
Всем привет.. пытаюсь понять один вопрос. допустим есть текстовый файл с таким содержанием я хочу эту информацию переписать в...

4
booogabooo
5 / 1 / 0
Регистрация: 04.12.2013
Сообщений: 50
09.02.2014, 20:53 #2
Структуру можно переписать так...
C++
1
2
3
4
5
6
7
struct music
{
   const char *name;
   const char *autor;
   int time;
   int price;
};
0
funduk17
40 / 3 / 0
Регистрация: 20.05.2013
Сообщений: 67
09.02.2014, 21:05  [ТС] #3
Цитата Сообщение от booogabooo Посмотреть сообщение
Структуру можно переписать так...
C++
1
2
3
4
5
6
7
struct music
{
   const char *name;
   const char *autor;
   int time;
   int price;
};
Появились ошибки при вводе, так не поможет! Но это не главное, я не могу нормально придумать функцию добавления, и что-бы она добавляла не в конец файла, а после определённого номера записи!
Работаю кстати в DEV-C++
Сейчас код такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct music
{      
   int numb;
   string name;
   string autor;
   int time;
   int price;
};
void ShowData(music *M, int N)
{
   for (int i = 0; i < N; i++)
    {
     cout << M[i].numb  << endl;       
     cout << M[i].name  << endl;
     cout << M[i].autor << endl;
     cout << M[i].time  << endl;
     cout << M[i].price << endl;
     cout << endl;
    }}
void GetData(music *M,int N)
{for (int i=0; i < N; i++)
    {M[i].numb=i+1;
     cout << "NAZVANIE: "; cin >> M[i].name;
     cout << "AUTOR: ";    cin >> M[i].autor;
     cout << "TIME: ";     cin >> M[i].time;
     cout << "PRICE: ";    cin >> M[i].price;
     cout << endl;
    }}
void DeleteElem(int itime,music *M, int &N)
{
   for (int i = 0; i < N; i++)
    {if(M[i].time==itime)
         {for (int k = i; k < N-1; k++)
             {M[k].name=M[k+1].name;
              M[k].autor=M[k+1].autor;
              M[k].time=M[k+1].time;
              M[k].price=M[k+1].price;
               }
             N--; 
             i--; 
         }}}
void StoreData(ofstream &out,music *M, int N)
{for (int i = 0; i < N; i++)
   {out << M[i].numb  << endl;
    out << M[i].name  << endl;
    out << M[i].autor << endl;
    out << M[i].time  << endl;
    out << M[i].price << endl;
    out << endl;} }
 
void addition(music *M, int N)
{
     
 }
int main()
{int N; cout << "Vvedite  Kollichestvo zapisey: "; cin >> N;
    music *M = new music[N];
    GetData(M, N);
    ofstream out("file.txt");
    StoreData(out,M, N);
    out.close();
    int time=60;
    DeleteElem(time,M,N);
    ShowData(M, N); 
    delete [] M;
    system("PAUSE");
    return 0; 
}
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.02.2014, 21:11 #4
если стандартными средствами писать данные в середину файла, то эта запись на сколько я знаю не раздвигает файл, а перезаписывает поверх старых (все равно что в редакторе на середину текста поставить курсор, нажать insert и печатать). нестандартных с другим поведением - не знаю. в вашем случае может прокатить такой обходной путь:
грузите свои структурки из памяти в какой-нибудь вектор. далее работаете с вектором (удаляете, добавляете куда надо и прочее). после таких изменений целиком этот вектор снова сохраняете в
файл.
0
funduk17
40 / 3 / 0
Регистрация: 20.05.2013
Сообщений: 67
09.02.2014, 21:22  [ТС] #5
Это огорчает, моих знаний не хватит чтобы сделать так, а вы смогли бы просто написать мне функцию добавления в конец файла хотя бы? Я уже писал выше что не работал с файлами, та и вообще не очень силён в С++, над этой задачей уже 2 дня сижу
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 21:22
Привет! Вот еще темы с ответами:

Работа с двоичными файлами - C++
Необходимо реализовать функцию чтения и записи небольших файлов в оперативную память (стек программы). Правильно ли я понимаю, что...

Работа с двоичными файлами - C++
Работа с двоичными файлами: Создать файл и записать в него степени числа 3. Вывести на экран все компоненты файла с четным порядковым...

Работа с двоичными файлами - C++
Всем добрый вечер!) По заданию требуется написать 2 программы (для открытия и чтения двоичного файла) для записи последовательности из n...

Работа с двоичными файлами и командной строкой - C++
Помогите, пожалуйста! Не нашла похожей задачи здесь, поэтому создаю новую тему. Нужно готовое решение, сроки горят. Учусь не на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
09.02.2014, 21:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru