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

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

Войти
Регистрация
Восстановить пароль
 
Artishok
ЧакЭ одобряЭ
280 / 279 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
#1

Создать список с последовательным хранением и записать его в бинарный файл - C++

03.03.2011, 12:56. Просмотров 601. Ответов 4
Метки нет (Все метки)

вообщем по условию задачи надо создать список с последовательным хранением и записать его в файл .bin.
Данные берутся из текстового файла(имя которого передается как параметр командной строки или есть файла нет создается и заполняется пользователем) и хранятся в виде
1 seans 12.12.1222 12:56 1 1
Эта запись разбивается по полям структуры.
Вообщем в чем проблема.Считывается из файла одна строка а потом вылетает прога с ошибкой.
(то что в список не записывается а следовательно и в бинарный файл...другая проблема.но не теперешняя)
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct
{
    int nommer;
    char seans[30];
    char date[15];
    char time[15];//d[2]=. d[5]=. d[10]=' ' d[13]=:
    int nober;
    int nomer;
}bilet;
 
void Destroy(bilet *list,int cnt)
{
 if(list) free(list);
 list = NULL; cnt = 0;
}
 
int Add(bilet val,bilet *list,int cnt)//äîáГ*âëåГ*ГЁГҐ Гў ГЄГ®Г*ГҐГ¶
{
 bilet *tmp = (bilet*)calloc(cnt+1,sizeof(bilet));
 if(!tmp) return 0;
 if(cnt) memcpy(tmp,list,cnt*sizeof(bilet));
 tmp[cnt] = val;
 cnt++; if(list) free(list); list = tmp;
 return 1;
}
 
int Ins(bilet val, int ind,bilet *list,int cnt)//äîáГ*âëåГ*ГЁГҐ Гў ïîçèöèþ
{
 if(ind < 0) return 0;
 if(ind >= cnt) return Add(val,list,cnt);
 bilet *tmp = (bilet*)calloc(cnt+1,sizeof(bilet));
 if(!tmp) return 0;
 memcpy(tmp,list,ind*sizeof(bilet));
 tmp[ind] = val;
 memcpy(&tmp[ind+1],&list[ind],(cnt-ind)*sizeof(bilet));
 cnt++; free(list); list = tmp;
 return 1;
}
        
int Del(bilet *list,int cnt,int ind)//ГіГ¤Г*ëåГ*ГЁГҐ ГЁГ§ ïîçèöèè
{
 if((ind<0)||(ind >= cnt)) return 0;
 if(cnt == 1) {Destroy(list,cnt); return 1;}
 bilet *tmp = (bilet*)calloc(cnt-1,sizeof(bilet));
 if(!tmp) return 0;
 memcpy(tmp,list,ind*sizeof(bilet));
 memcpy(&tmp[ind],&list[ind+1],(cnt-ind-1)*sizeof(bilet));
 cnt--; free(list); list = tmp;
 return 1;
}
 
int poisk(bilet *list,char *temp,int cnt)//ïîèñê Г*ГіГ¦Г*îé ñòðîêè
{
    if (!strcmp(temp,""))
     return 0;
    for(int i=0;i<cnt;i++)
    {
        if (!strcmp(list[i].date,temp))//åñëè Г°Г*ГўГ*Г»
        {
            Del(list,cnt,i);
        }
    }
    return 1;
}
 
void sort(bilet *list,int i,int cnt)
{
    if (cnt<1) return;
    switch(i)
    {
    case 1:
        {
            for(int j=0;j<cnt;j++)
                for(int k=cnt-1;k>j;k--)
                    if (list[k-1].nomer<list[k].nomer)
                    {
                        bilet z=list[k-1];
                        list[k-1]=list[k];
                        list[k]=z;
                    }
        break;
        }
    case 2:
        {
            for(int j=0;j<cnt;j++)
                for(int k=cnt-1;k>j;k--)
                    if (list[k-1].nomer>list[k].nomer)
                    {
                        bilet z=list[k-1];
                        list[k-1]=list[k];
                        list[k]=z;
                    }
        break;
        }
    }
}
 
 
 
int main(/*int argc,char *argv[]*/)
{
    bilet *list=NULL;
    int cnt;
    char s[100];
//  cout<<"Numner <<Seans>> dd.mm.gggg cc:mm number number"<<endl;
//  gets(s);
    FILE *ft;
    
     ft=fopen("original.txt","wt");
     int n;
     cout<<"Kol-vo elementov"<<endl;
     cin>>n;
     for(int i=0;i<n;i++)
     {
         gets(s);
         s[100]='\n';
         s[99]='\0';
         fputs(s,ft);
     }
     fclose(ft);*/
     ft=fopen("original.txt","rt");
    cnt=-1;
    char *str;
    /*int yy;
    cout<<"Vvedite napravlenie sortirovki 1 - ub 2 -vosr"<<endl;
    cin>>yy;*/
    while (!feof(ft))
    {
    //  if (!feof(ft))
    //  {
            cnt++;
            bilet tmp;
            fgets(s,100,ft);
            str=strtok(s," ");//Г*îìåð
            tmp.nommer=atoi(str);
            str=strtok(NULL," ");//Г±ГҐГ*Г*Г±
            strcpy(tmp.seans,str);
            str=strtok(NULL," ");//Г¤Г*ГІГ*
            strcpy(tmp.date,str);
            str=strtok(NULL," ");//âðåìÿ
            strcpy(tmp.time,str);
            str=strtok(NULL," ");//Г*îìåð Г·ГҐГЈГ®-ГІГ®
                tmp.nober=atoi(str);
            str=strtok(NULL," ");//òîæå Г*îìåð
            tmp.nomer=atoi(str);
            Add(tmp,list,cnt);
         //   sort(list,yy,cnt);
    //  }
            
    }
    fclose(ft);
    cout<<"Ishodnii spisok"<<endl;
    for(int i=0;i<cnt;i++)
    {
        cout<<list[i].nommer<<" "<<list[i].seans<<" "<<list[i].date<<" "<<list[i].time<<" "<<list[i].nober<<" "<<list[i].nomer<<endl;
    }
    char y[15];
    cout<<"VVedire datu xx.yy.zzzz"<<endl;
    gets(y);
    poisk(list,y,cnt);
    cout<<"Udaleno"<<endl;
    cout<<"Sorted"<<endl;
    FILE *fb;
    fb=fopen("result.bin","wb+");
    for(int i=0;i<cnt;i++)
    {
        fwrite(&list[i],sizeof(bilet),1,fb);
    }
    fclose(fb);
   /* bilet x;
    fb=fopen("result.bin","rb");
    while(!feof(fb))
    {
        if (!feof(fb))
        {
            fread(&x,sizeof(bilet),1,fb);
            cout<<x.seans<<" "<<x.date<<" "<<x.time<<" "<<x.nober<<" "<<x.nomer<<endl;
        }
    }
    fclose(fb);*/
}
я пытался сделать запись по строкам т.е.
XXXXX....
XXXX.....
но почему-то записывается в строку.хотя я и записывал в последний элемент строки '\n' и'\0'

Я вывожу считанные данные чтобы проверить верно ли разбивается строка.Вроде верно.И то что считывает прога тоже верно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2011, 12:56
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создать список с последовательным хранением и записать его в бинарный файл (C++):

Записать информационную часть списка в бинарный файл, и прочитать его - C++
Подскажите, как записать информационную часть измененного списка в бинарный файл и прочитать его? #include &quot;stdafx.h&quot; #include...

Заполнить массив структур сканеров и записать его в бинарный файл - C++
Здравствуйте! Новый день - новая проблема. Не могу справиться с заданием семинара, помогите пожалуйста. Семинар из практикума...

Создать бинарный файл f и записать в него целые числа - C++
Создать бинарный файл f и записать в него целые числа. Организовать просмотр бинарного файла и его обработку: Найти все не четные числа и...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод) - C++
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student { string firstname,lastname, group; ...

Записать в файл txt числа с последовательным увеличением на 1...100 штук - C++
записать в файл txt числа с последовательным увеличением на 1...100 штук

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

4
schdub
3009 / 1354 / 264
Регистрация: 19.01.2009
Сообщений: 3,583
Завершенные тесты: 1
03.03.2011, 13:33 #2
Цитата Сообщение от Artishok Посмотреть сообщение
C++
1
2
s[100]='\n';
s[99]='\0';
по идее, надо наоборот
C++
1
2
s[99]='\n';
s[100]='\0';
и еще откуда взялись эти магические цифры? откуда вы знаете, что прочитанная строка будет состоя именно из 98 символов? допустим, пользователь ввел строку "qerty asdf 123" без кавычек. после того, как Вы выполняете данный код, то после символов 123 до 98 символа будет мусор.
0
Artishok
ЧакЭ одобряЭ
280 / 279 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
03.03.2011, 13:54  [ТС] #3
я на последние символы размерности строки записываю символы окончания и перехода строки а поскольку размер строки максимальный 100 то я на 100 и записываю

и кстати.как записывать в файл столбцом?

Добавлено через 12 минут
теперь уже и из файла не считает
0
schdub
3009 / 1354 / 264
Регистрация: 19.01.2009
Сообщений: 3,583
Завершенные тесты: 1
03.03.2011, 14:00 #4
Цитата Сообщение от Artishok Посмотреть сообщение
максимальный 100
не забывайте, что адресация массива начинается с 0, а последний элемент будет с индексом 99, а уж не как не 100.

Добавлено через 4 минуты
Цитата Сообщение от Artishok Посмотреть сообщение
как записывать в файл столбцом?
единственное, что приходит на ум, просто грузишь в память, производишь необходимые манипуляции, перезаписываешь файл полностью.
0
Artishok
ЧакЭ одобряЭ
280 / 279 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
03.03.2011, 20:31  [ТС] #5
А если в файле все записано то с помощью fgets оно будет считываться по строкам так?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2011, 20:31
Привет! Вот еще темы с ответами:

Создать файл с именем указанным пользователем и записать в него его же имя - C++
Необходимо создать файл с именем указанным пользователем и записать в него его же имя string name; cout&lt;&lt;&quot;Введите имя: &quot;; ...

создать файл 1.part и записать в него первые x элементов массива. После чего, создать второй файл 2.part, куда записать оставшиеся в массиве элементы. - C++
Не могу понять почему не работает вот этот кусок текста. ofstream q (&quot;1.part&quot;); for (int i=0; i&lt;10; ++i) { q &lt;&lt; mas ; ...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой - C++
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные записывались в файл F1.txt, затем читались...

Записать структуру в бинарный файл - C++
Всем доброго времени суток. у меня такая проблема, мне нужно перекинуть в бинарный файл структуру. Структуру создала, все сделала. Файл...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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