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

Работа с файлами - C++

Восстановить пароль Регистрация
 
Naruto88
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 18
25.03.2011, 15:06     Работа с файлами #1
Здравствуйте! У меня возникла такая проблема. Мне нужно переместить строковую информацию из двоичного файла в текстовый в таком же порядке в котором она отображается при выводе на экран.
Текстовый файл должен создаваться после того как пользователь выберет в меню пункт переместить из двоичного в текстовый. Текстовый файл должен выводить информацию на экран.

Вот код программы который выполнен на Borland Builer 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
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
 
const int size = 10; //максимальный размер
int factsz; //фактический размер
char filename [MAX_PATH];
 
struct Item {
    int release; /* номер версии */
    int len;
    long ofs;
    //char *string; /* указатель на структуру символов */
    Item *next; /* указатель на следующий элемент */
};
 
struct Node {
    int key; /* ключ элемента */
    Item *info; /* указатель на информацию */
} table[size];
 
//функции списка
 
bool SaveToFile (long& offset, char* info) //сохранение в файл строковой информации
{
    FILE* f = fopen (filename, "a+b"); //открываем для добавления в конец
    if (f==NULL) return false;
    fseek (f, 0, SEEK_END); //ставим указатель в файле на его конец
    offset = ftell(f); //сохраняем текущее смещение
    int l = strlen(info);
    if (l!=fwrite (info, 1, l, f)) {fclose (f); return false; }
    else { fclose (f); return true;}
}
 
void AddLast (Item* &sp, int rel, char* str) //добавление в конец списка
{
    Item* tmp = sp;
    while (tmp!=NULL && tmp->next!=NULL) tmp = tmp->next;
    if (tmp!=NULL) { //если список не пуст
        tmp->next = new Item;
        tmp = tmp->next;
    } else { //если список новый
        tmp = new Item;
        sp = tmp;
    }
    tmp->next = NULL;
    tmp->release = rel;
    tmp->len = strlen(str);
    //strcpy (tmp->string, str);
    if (!SaveToFile (tmp->ofs, str)) cout << "Error!";
}
 
void AddSorted (Item* &sp, int rel, char* str) //добавление по порядку в список
{
    if (sp==NULL) AddLast (sp, rel, str);
    Item* tmp = sp;
    Item* buf = new Item;
    buf->release = rel;
    buf->len = strlen(str);
    if (!SaveToFile (buf->ofs, str)) cout << "Error!";
    //buf->string = new char [strlen(str)+1];
    //strcpy (buf->string, str);
 
    if (tmp->release>=rel) {
        buf->next = tmp;
        sp = buf;
    } else {
        while (tmp->next!=NULL && tmp->next->release<rel) tmp = tmp->next;
        buf->next = tmp->next;
        tmp->next = buf;
    }
}
 
 
bool DelByRelease (Item* &sp, int rel) //удаление по числовому полю
{
    Item* tmp = sp, *d;
    if (tmp==NULL) return false; //если список пуст
    if (tmp->release==rel) { //если это первый элемент
        sp = tmp->next;
        //delete [] tmp->string;
        delete tmp;
        return true;
    }
    while (tmp->next!=NULL && tmp->next->release!=rel) tmp = tmp->next;
    if (tmp->next==NULL && tmp->release!=rel) return false; //если нет такого
    d = tmp->next; ///если нашли
    tmp->next = tmp->next->next;
    //delete [] d->string;
    delete d;
    d = NULL;
    return true;
}
 
char* ReadFromFile (char* buf, long ofs, int len, FILE* f)
//чтение из файла в буфер с заданным смещением, возвращает указатель на тот же буфер для удобства
{
    if (f==NULL) return 0;
    if (fseek (f, ofs, SEEK_SET)) return 0; //смещаемся на нужное место
    fread (buf, 1, len, f); //читаем заданное число байт
    buf[len] = '\0';
    return buf;
}
 
void Print (Item* sp) //вывод списка на экран
{
    FILE* f = fopen (filename, "rb");
    Item* tmp = sp;
    char* buf;
    while (tmp!=NULL) {
        buf = new char [tmp->len+1];
        cout << tmp->release << "   " << ReadFromFile(buf, tmp->ofs, tmp->len, f) << "; ";
        tmp = tmp->next;
        delete [] buf;
    }
    fclose (f);
}
 
void Clear (Item* &sp) //очистка памяти из-под списка
{
    Item* tmp = sp, *d;
    while (tmp!=NULL) {
        d = tmp; //сохраняем ссылку
        tmp = tmp->next; //переходим на следующий
        //delete [] d->string; //удаляем строку
        delete d; //удаляем элемент
        d = NULL;
    }
}
 
//
//функции таблицы
 
/*int SearchInTable (int key) //поиск в таблице по ключу
{
    for (int i=0; i<factsz; i++)
        if (table[i].key==key) return i;
    return -1; //-1 если не нашли
}*/
 
int BinarySearchInTable (int key)
{
int first = 0; // Первый элемент в массиве
  int last = factsz-1; // Последний элемент в массиве
 
  if ( key < table[first].key || key > table[last].key ) {
    return -1;
  }
 
  int mid = ( first + last ) / 2; // В Си это эквивалентно целочисленному делению на 2 в других языках (дробная часть отсекается)
 
  while ( first < last ) {
 
      if ( key <= table[mid].key ) {
      last = mid;
    } else {
      first = mid + 1;
    }
    mid=first+(last-first)/2;//Таким образом в вычислениях выйти за пределы значений для данного типа невозможно
  }
 
  if ( table[last].key == key ) {
    return last;
  } else {
    return -1;
  }
}
 
bool AddNew (int key, int rel, char* str) //добавление нового
{
    int j = BinarySearchInTable(key); //ищем, есть ли такой ключ
    if (j==-1) { //если нет
        if (factsz+1>size) return false; //если таблица заполнена
        factsz++; //если можно добавить ещё элемент
        table[factsz-1].key = key; //создаём новый
        AddLast (table[factsz-1].info, rel, str);
    } else { //если ключ уже есть
        AddLast (table[j].info, rel, str); //добавляем в существующий
    }
    return true;
}
 
bool AddNewSorted (int key, int rel, char* str) //добавление нового
{
    int j = BinarySearchInTable(key); //ищем, есть ли такой ключ
    if (j==-1) { //если нет
        if (factsz+1>size) return false; //если таблица заполнена
        int ins = factsz;
        for (int i=0; i<factsz; i++) 
            if (table[i].key>=key) {ins = i; break;}
        factsz++; //если можно добавить ещё элемент
        for (int i=factsz-1; i>ins; i--) {
            table[i].key = table[i-1].key;
            table[i].info = table[i-1].info;
        }
        table[ins].key = key; //создаём новый
        table[ins].info = NULL;
        AddLast (table[ins].info, rel, str);
    } else { //если ключ уже есть
        AddSorted (table[j].info, rel, str); //добавляем в существующий
    }
    return true;
}
 
bool delByKeyAndRel (int key, int rel) //удаление по ключу и релизу
{
    int j = BinarySearchInTable (key); //ищем в таблице
    if (j==-1) return false; //если такого ключа нет - выходим
    return DelByRelease (table[j].info, rel); //иначе пытаемся удалить из списка
}
 
void Clear () //очистка талицы
{
    for (int i=0; i<factsz; i++)
        Clear (table[i].info); //очищаем все списки
    factsz = 0;
}
 
void Print () //печать таблицы
{
    for (int i=0; i<factsz; i++) {
        cout << endl << table[i].key << ": ";
        Print (table[i].info); //печатаем список
    }
}
 
/////////////////// 
 
int Menu () //вывод меню
{
    int c;
    cout << "1. Add new record.\n2.Delete record.\n3.Clear table.\n4.Print table.\n5.Exit.\n";
    cout << "Enter menu item: ";
    cin >> c;
    while (c<=0 || c>5) {
        cout << "Uncorrect! Reenter: ";
        cin >> c;
    }
    return c;
}
 
void Add1 () //пункт 1
{
    int key, rel;
    char str [50];
    cout << "\nEnter key, release and string:\n";
    cin >> key;
    cin >> rel;
    cin >> str;
    if (AddNewSorted (key, rel, str)) {
        cout << "\nSuccess. Press any key to continue.";
        _getch ();
    } else {
        cout << "\nFailure. Not enougth memory. Press any key to continue.";
        _getch();
    }
}
 
void Delete2 () //пункт 2
{
    int key, rel;
    cout << "\nEnter key and release:\n";
    cin >> key;
    cin >> rel;
    if (delByKeyAndRel (key, rel)) {
        cout << "\nSuccess. Press any key to continue.";
        _getch ();
    } else {
        cout << "\nFailure. No such record. Press any key to continue.";
        _getch();
    }
}
 
void Clear3 () //пункт 3
{
    Clear ();
    cout << "\nSuccess. Press any key to continue.";
    _getch ();
}
 
void Print4 () //пункт 4
{
    Print ();
    cout << "\nPress any key to continue.";
    _getch ();
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    factsz = 0; //фактическое число элементов в таблице = 0
    bool b = true; //флаг выхода
    cout << "Input file name: ";
    cin >> filename;
    while (b) {
        system ("cls"); //очистка экрана
        int c = Menu (); //вывод меню
        switch (c) { //обработка выбора
        case 1: Add1();
                break;
        case 2: Delete2();
                break;
        case 3: Clear3();
                break;
        case 4: Print4();
                break;
        case 5: b = false;
                break;
        }
    }
    Clear (); //очистка памяти
    DeleteFile (filename);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2011, 15:06     Работа с файлами
Посмотрите здесь:

C++ Работа с файлами
C++ Работа с файлами
C++ Работа с файлами
C++ Работа с файлами на С++
работа с файлами C++
C++ [C++] Работа с файлами
C++ Работа с файлами
C++ С++ Работа с файлами!!!!

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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