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

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

Войти
Регистрация
Восстановить пароль
 
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
03.03.2011, 12:56     Создать список с последовательным хранением и записать его в бинарный файл #1
вообщем по условию задачи надо создать список с последовательным хранением и записать его в файл .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'

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

C++ Записать матрицу в бинарный файл и посчитать среднее арифметическое её членов
Записать в файл txt числа с последовательным увеличением на 1...100 штук C++
Создать бинарный файл f и записать в него целые числа C++
C++ Создать, отсортировать, записать в файл двусвязный список чисел
Данные из текстового файла записать в бинарный файл C++
C++ Записать массив структур в бинарный файл
Создать файл с именем указанным пользователем и записать в него его же имя C++
Записать по одному элементу числовую матрицу в бинарный файл C++
Из текстового файла считать матрицу и записать ее в бинарный файл C++
Как класс string записать в бинарный файл через вектор? C++
Записать информационную часть списка в бинарный файл, и прочитать его C++
C++ Заполнить массив структур сканеров и записать его в бинарный файл

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
 Аватар для schdub
2907 / 1251 / 224
Регистрация: 19.01.2009
Сообщений: 3,242
Завершенные тесты: 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 символа будет мусор.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
03.03.2011, 13:54  [ТС]     Создать список с последовательным хранением и записать его в бинарный файл #3
я на последние символы размерности строки записываю символы окончания и перехода строки а поскольку размер строки максимальный 100 то я на 100 и записываю

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

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

Добавлено через 4 минуты
Цитата Сообщение от Artishok Посмотреть сообщение
как записывать в файл столбцом?
единственное, что приходит на ум, просто грузишь в память, производишь необходимые манипуляции, перезаписываешь файл полностью.
Artishok
ЧакЭ одобряЭ
 Аватар для Artishok
277 / 276 / 32
Регистрация: 27.12.2009
Сообщений: 1,767
03.03.2011, 20:31  [ТС]     Создать список с последовательным хранением и записать его в бинарный файл #5
А если в файле все записано то с помощью fgets оно будет считываться по строкам так?
Yandex
Объявления
03.03.2011, 20:31     Создать список с последовательным хранением и записать его в бинарный файл
Ответ Создать тему
Опции темы

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