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

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

Войти
Регистрация
Восстановить пароль
 
Naruto88
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 18
#1

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

25.03.2011, 15:06. Просмотров 298. Ответов 0
Метки нет (Все метки)

Здравствуйте! У меня возникла такая проблема. Мне нужно переместить строковую информацию из двоичного файла в текстовый в таком же порядке в котором она отображается при выводе на экран.
Текстовый файл должен создаваться после того как пользователь выберет в меню пункт переместить из двоичного в текстовый. Текстовый файл должен выводить информацию на экран.

Вот код программы который выполнен на 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2011, 15:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с файлами (C++):

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

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

Работа с файлами в C, C++ - C++
Есть, файл в котором храниться много чисел типа double Файл был записан следующим образом FILE * yy1; ...

Работа с файлами - C++
Здравствуйте,помогите пожалуйста с решением задачи, Каждая строка текстового файла содержит название города и число его жи-телей. Используя...

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2011, 15:06
Привет! Вот еще темы с ответами:

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

Работа с файлами на С++ - C++
Как сохранить результат вычислений на текстовом файле? Я пробовал открыт текстовый файл в начале программы и и в конце закриваль но не...

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

Работа с файлами - C++
#include&lt;iostream&gt; using namespace std; void main() { FILE *f,*g; int a,kol=0; fopen_s(&amp;f,&quot;D:\\1.txt&quot;,&quot;r&quot;); ...


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

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

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