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

Запись в структуру из файла. База данных - C++

Восстановить пароль Регистрация
 
 
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
17.12.2013, 17:33     Запись в структуру из файла. База данных #1
Добрый день. Помогите советом, очень нужно, т.к. собираюсь доделать за ближайшие часы.

Я пишу базу данных на основе двусвязного списка. Сделал, чтобы все записывалось в файл. Теперь пишу, чтобы можно было считать и дописать базу.

Вот в чем проблема:

вот моя база в txt:
Код
=================================================================
Name:          Number:          Size:          
dima          123213           123132         
leha          1231             12313          
misha        67568             5657           
=================================================================
По скольку таблиц в Сипипи я не знаю, делал табличку с помощью пробелов.
Теперь я построчно считываю файл в строки, разделяю на слова и пытаюсь запихнуть все это обратно в структуры.
Если кто знает более рац способ, сообщите пж.

вот на чем остановился:

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
char F[] = "A:/file2.txt";
ifstream infile;
infile.open(F,ios::in|ios::binary);
    
if(!infile.is_open()) // если файл не открыт
cout << "File can not be open!\n"; // сообщить об этом
else
{
        int SIZE = 67;
        infile.seekg(SIZE);
    int size;
    size = 80;
        string s;
        Data *y = new Data[n];
    const char separator[]=" ";
    for(int i=0;i<n;i++)
    {
              int count = 0;
        while (!infile.eof()))
        {
            getline(infile,s);
                        char *a = new char[120];
            strcpy(a, s.c_str() );
            ptr = strtok(a,separator);
                        cout<<s<<endl;
                }
                infile.close();
        }
}
у форума какая-то проблема с табуляцией, раньше такого не было. ..

В общем, по словам разделяется и выводится на экран, но вылетает ошибка связанная с памятью. Подозреваю, что из-за последней строчки с =====. Как ее не трогать я хз, сверху seekg использовал, а снизу как..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.12.2013, 18:47     Запись в структуру из файла. База данных #2
Обчно, в файл всякую красоту не записывают, это только мешает обработке файла (в файл нужно только поля структур писать). Красоту можно и при выводе делать. Пропустить ненужную строку можно без seekg(), просто сделать чтение в какую-либо временную строку. Зачем читать строки и на слова разделять? Можно читать словами (infile >>) в поля структуры, или выводить (не знаю, что там нужно).
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
17.12.2013, 19:34  [ТС]     Запись в структуру из файла. База данных #3
alsav22, а записи структур разделять пробелом?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.12.2013, 19:46     Запись в структуру из файла. База данных #4
Цитата Сообщение от Greeezly Посмотреть сообщение
а записи структур разделять пробелом?
Зачем? Вы же знаете сколько полей в структуре.

Добавлено через 2 минуты
Если неизвестно сколько структур в файле, можно сначала посчитать (строки), чтобы нужный размер памяти выделить, или записывать, в начало файла (первой строкой), количество структур.

Добавлено через 6 минут
Если поля int и массивы char, то можно в бинарном режиме записывать\читать (хотя тут есть ньюансы, связанные с выравниваем структур в памяти).
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
17.12.2013, 21:06  [ТС]     Запись в структуру из файла. База данных #5
объясните еще, почему у меня вот такой вывод пашет:
C++
1
2
3
4
5
ofstream outfile;
outfile.open(F,ios::out|ios::binary);
outfile<<x[i].Name;
outfile<<x[i].number;
outfile.close();
а вот такой не пашет:

C++
1
2
3
4
ofstream  outfile(F,ios::binary|ios::out);
for(int i=0;i<n;i++)
outfile.write((char*)&x[i],sizeof(x[i]));
outfile.close();
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.12.2013, 21:26     Запись в структуру из файла. База данных #6
Что значит "пашет", "не пашет"?
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
17.12.2013, 21:55  [ТС]     Запись в структуру из файла. База данных #7
работает\не работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.12.2013, 21:57     Запись в структуру из файла. База данных #8
Цитата Сообщение от Greeezly Посмотреть сообщение
работает\неработает
Это не ответ... Проблему опишите, чтобы понятно было.
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
17.12.2013, 21:59  [ТС]     Запись в структуру из файла. База данных #9
в обоих случаях компилятор не ругается. Только в "работающем" выводится все, что мне нужно. А в неработающем - первые несколько символов из имени. Тут явно какая-то заморочка с памятью - во-первых с переводом из собственного типа данных struct Data в char, а во-вторых результат менялся если менять выделяемую память - второй аргумент функции. Я его даже вручную задавал с запасом в 8 байт.
Я все варианты поперебрал, не робит и всё(

хотя такое уже много раз встречал в кодах, вот например:
главное тут
и тут пост#8
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.12.2013, 00:34     Запись в структуру из файла. База данных #10
Структуру покажите. Сколько там полей? В первом посте три, в пятом уже две... Надеюсь, там не string? Среда какая?
vitecd
18 / 1 / 0
Регистрация: 26.09.2013
Сообщений: 59
18.12.2013, 02:58     Запись в структуру из файла. База данных #11
...
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
18.12.2013, 05:48  [ТС]     Запись в структуру из файла. База данных #12
VS 2010, структура:
const char и int
C++
1
2
3
4
5
struct Data
{
char Name[25];
int number;
};
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.12.2013, 06:18     Запись в структуру из файла. База данных #13
Такая - должна без особых проблем записываться в бинарном режиме. Если упростить:
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
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
 
struct Data
{
    char Name[25];
    int number;
};
 
 
int main()
{
    const int n = 3;
    char* str[3] = {"aaa aaa", "bbb bbb", "ccc ccc"};   
    
    Data* x = new Data[n];
    for(int i = 0; i < n; i++)
    {
        strcpy(x[i].Name, str[i]);
        x[i].number = i + 1;
    }
 
    char F[] = "file2.txt";
    ofstream  outfile(F, ios::binary | ios::out);
    for(int i = 0; i < n; i++)
        outfile.write((char*)&x[i], sizeof(x[i]));
    outfile.close();
    delete [] x;
    
    Data* y = new Data[n];
    ifstream infile(F, ios::in | ios::binary);
    if (!infile) cout << "Error!" << endl;
    else
    {
        for(int i = 0; i < n; i++)
        infile.read((char*)&y[i], sizeof(y[i]));
            infile.close();
 
        for(int i = 0; i < n; i++)
            cout << y[i].Name << ' ' << y[i].number << endl;
    }
    
    cout << endl;
    system("pause");
    return 0;
}
Можно ещё, для выравнивания структуры в памяти, попробовать так:
C++
1
2
3
4
5
6
7
#pragma pack(push, 1)
struct Data
{
    char Name[25];
    int number;
};
#pragma pack(pop)
Если не поможет, значит где-то, что-то не то делаете. Прийдётся весь код изучать.
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
18.12.2013, 06:36  [ТС]     Запись в структуру из файла. База данных #14
использовал ваше чтение.

мой текст файл выглядит так:
Код
Timka 123
Julik 124114
Enigma 123123
вывод прилагается. лишнюю память наверное цепанули.

там где ввод не обращайте внимание, не весь код закомментил.
Миниатюры
Запись в структуру из файла. База данных  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.12.2013, 17:26     Запись в структуру из файла. База данных #15
Цитата Сообщение от Greeezly Посмотреть сообщение
использовал ваше чтение.
мой текст файл выглядит так:
Какое моё чтение? Бинарное? Но оно подходит только для бинарной записи. Если запись в файл делается в текстовом режиме, то и чтение - в текстовом. То же самое и для бинарных методов.
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
18.12.2013, 19:48  [ТС]     Запись в структуру из файла. База данных #16
Оно подходит и для текстового, но только не всегда знаем точный объем памяти, который нужно выделить под рид.

Добавлено через 3 минуты
То что было нужно - сделал, спасибо Вам большое за помощь!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.12.2013, 19:49     Запись в структуру из файла. База данных #17
Цитата Сообщение от Greeezly Посмотреть сообщение
Оно подходит и для текстового
Сами придумали? О чём, вообще, разговор?
Greeezly
 Аватар для Greeezly
6 / 6 / 1
Регистрация: 31.08.2012
Сообщений: 230
18.12.2013, 20:03  [ТС]     Запись в структуру из файла. База данных #18
Это получено чисто экспериментально=)

Добавлено через 1 минуту
работает и запись и чтение, но там вечные промахи в памяти
alsav22
18.12.2013, 20:08
  #19

Не по теме:

Цитата Сообщение от Greeezly Посмотреть сообщение
работает и запись и чтение, но там вечные промахи в памяти
По-вашему, это называется: работает ?

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2013, 20:14     Запись в структуру из файла. База данных
Еще ссылки по теме:

Считывание данных из текстового файла в структуру C++
Разработка программы конвертации csv файла в xml структуру данных C++
Ввод с клавиатуры данных и запись их в структуру C++

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

Или воспользуйтесь поиском по форуму:
Alexsandr_S
5 / 5 / 1
Регистрация: 23.10.2013
Сообщений: 18
18.12.2013, 20:14     Запись в структуру из файла. База данных #20
outfile.write((char*)&x[i],sizeof(x[i])); outfile.write((char*)&x[i],sizeof(надо имя структуры а не отдельный элемент ));
Yandex
Объявления
18.12.2013, 20:14     Запись в структуру из файла. База данных
Ответ Создать тему
Опции темы

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