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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ работа с файломи http://www.cyberforum.ru/cpp-beginners/thread219256.html
Задан текстовый файл Input.txt, состоящий из слов. Разделителями между словами является некоторое множество знаков препинания. Для каждой строки, начиная со второй, продублировать слова, которые встречаются в первой строке и записать результат в новый файл Output.txt. Упорядочить слова в полученных строках по возрастанию количества латинских строчных букв в словах, результат сортировки...
C++ Дан целый массив максимальной размерности 20*20. Провести сортировку по возрастанию в нечетных строках массива и по убыванию в четных строках. Дан целый массив максимальной размерности 20*20. Провести сортировку по возрастанию в нечетных строках массива и по убыванию в четных строках. Ввод исходного массива организовать из файла, при вводе учесть возможность ввода массива меньшей размерности. Результаты работы программы вывести на экран и в файл. http://www.cyberforum.ru/cpp-beginners/thread219255.html
C++ работа с файлами и строками
В файле хранится информация об учениках школы: имя,фамилия, класс(номер и буква),рост .В новый файл переписать информацию о 3 самых высоких учениках в каждой паралели. вывести в отдельный файл чей рост выше среднего по школе.
C++ реалезация очереди
Реализовать очередь. Организовать работу пользователя со списком при помощи меню: 0 – выход из программы; 1 – добавить новый элемент в голову очереди; 2 – удалить элемент с хвоста очереди; 3 – вывести список всех элементов. #include <stdlib.h> #include <stdio.h> #include <conio.h> //создаем струкутуру struct point
C++ анимация http://www.cyberforum.ru/cpp-beginners/thread219241.html
Ребят, помогите не могу описать движение, нужно что бы ракета переместилась из одной точки в другую по дуге, начальная точка (60, 430) конечная (810, 430), радиус без разницы какой... ось Y направлена вниз...
C++ Опишите структуру с именем STUDENT Пожалуйста, помогите(: Вот это надо: Опишите структуру с именем STUDENT, содержащую следующие поля: - фамилия и инициалы; - номер группы; - успеваемость (массив из 5 элементов). Программа должна обеспечить выполнение следующих действий: 1) ввод с клавиатуры данных в массив, состоящий из 10 структур типа STUDENT; 2) вывод на экран монитора... подробнее

Показать сообщение отдельно
Tilk
 Аватар для Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
24.12.2010, 06:17     Файл - буфер - файл (istrem/ostream)
Всем добрый день. Помогите пожалуйста найти ошибку.

Структура для описания объекта - 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)  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru