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

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

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

Файл - буфер - файл (istrem/ostream) - C++

24.12.2010, 06:17. Просмотров 870. Ответов 0
Метки нет (Все метки)

Всем добрый день. Помогите пожалуйста найти ошибку.

Структура для описания объекта - 4 int числа.
C++
1
2
3
4
5
struct L_Object
{
    int id;
    int xpos, ypos, zpos;
};
Мне нужно реализовать механизм для чтения и записи файла со списком таких объектов. Для этой цели я написать вот такой класс.

C++
1
2
3
4
5
6
7
8
9
10
11
class L_MapSector
{
public:
    int numobjects;
    char* filebuffer;
    int bufferlenght;
    vector<L_Object> Objects;
    void AddData(L_Object tObject);
    int ReadData();
    int SaveData();
};
Вот как хочу чтобы это работало.
numobjects - количество объектов в файле.
filebuffer - буфер, с которым будет вестись работа (чтение, редактирование и запись в файл)
Objects - список объектов.
AddData - в данном случае не важен.
ReadData - метод для чтения данных и инициализации filebuffer и bufferlenght
SaveData - переписывает файл, записывая в него содержимое filebuffer, размером bufferlenght.

Для начала я хочу, чтобы в файле было хоть что-то читабельное. Поэтому в SaveData я инициализирую временный буфер с фиксированым содержанием(testbuffer) и пытаюсь записать его в файл "test.txt".
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
int L_MapSector::SaveData()
{
    ofstream fout("test.txt", ios::out | ios::binary);
 
    L_Object test;
 
    test.id = 1;
    test.xpos = 2;
    test.ypos = 3;
    test.zpos = 4;
 
    char* testbuffer;
    testbuffer = new char[16];
 
    memcpy(testbuffer +  0, &test.id,   sizeof(int));
    memcpy(testbuffer +  4, &test.xpos, sizeof(int));
    memcpy(testbuffer +  8, &test.ypos, sizeof(int));
    memcpy(testbuffer + 12, &test.zpos, sizeof(int));
 
    fout.write(testbuffer, 16);
    fout.close();
 
    return 0;
}
В программе я привязал этот код к кнопке "пробел", чтобы заполнить файл содержанием.

А вот как я пытаюсь прочитать файл
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
int L_MapSector::ReadData()
{
    ifstream is;
    is.open("test.txt", ios::binary);
 
    is.seekg(0, ios::end);
    bufferlenght = (int)is.tellg();
    is.seekg(0, ios::beg);
 
    filebuffer = new char [bufferlenght];
    is.read(filebuffer, bufferlenght);
    is.close();
 
    numobjects = (int)bufferlenght/sizeof(L_Object);
 
    Objects.clear();
    for(int i=0;i<numobjects;i++)
    {
        L_Object newobject;
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  0, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  4, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  8, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) + 12, sizeof(int));
        Objects.push_back(newobject);
    }
 
    return 0;
}
В итоге после попытки чтения файла, список Objects заполняется некорректно. (скрин значений во вложении). Помогите пожалуйста разобраться.

========================

Отбой, проблема решена. Ошибка была здесь - писал все значения по одному адресу.
C++
1
2
3
4
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  0, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  4, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) +  8, sizeof(int));
        memcpy(&newobject.id, filebuffer + i * sizeof(L_Object) + 12, sizeof(int));
Миниатюры
Файл - буфер - файл (istrem/ostream)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2010, 06:17     Файл - буфер - файл (istrem/ostream)
Посмотрите здесь:

Как спроецировать файл в буфер? - C++
У меня 2 вопроса: 1) Как спроецировать файл в буфер? 2) Как составить спроецированный файл в буфере?

Записать в файл строку. Скопировать в буфер последние два слова. Вывести содержимое буфера на экран - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){ ofstream fout(&quot;test.txt&quot;); if(!fout) { ...

Заполнить файл целыми случайными числами, скопировать чётные в другой файл - C++
Заполнить в файл последовательного доступа f целыми числами, полученными с помощью генератора случайных чисел. Получить в файле g те...

Шахматный турнир. Сформировать файл фамилий участников и файл результатов - C++
Помогите исправить ошибки. Задание: В шахматном турнире участвуют 10 шахматистов. Сформировать файл фамилий участников и файл...

Как вывести в файл последние буквы каждого слова в файл? - C++
Помогите, пожалуйста. Задание следующее: сформировать строку из последних букв исходного текста. Текст хранится в файле, нужно взять оттуда...

Что такое h -файл и obj-файл?Зачем они нужны? - C++
1.Что такое h -файл и obj-файл?Зачем они нужны?

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

Все слова, начинающиеся с гласных переписать в один файл, а с согласных – в другой новый файл - C++
11. Все слова, начинающиеся с гласных переписать в один файл, а с согласных – в другой новый файл.

Файл: Сформировать файл, элементами котого являются числа a1, a1*a2, a1*a2*a3,..., a1*a2*a3*...*an - C++
привет всем, помогите пожалуйста решить задачку. Записать в файл N натуральных чисел: a1,a2,...,an(числа получить с помощью датчика...

Разбиение метода класса на файл реализации и файл заголовка - C++
Добрый вечер. Есть код в заголовочном файле класса : #pragma once class MyArr { private: int *numbers; public: int...


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

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

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