0 / 0 / 0
Регистрация: 09.06.2015
Сообщений: 3
1

Работа с двоичным файлом

09.06.2015, 19:31. Показов 633. Ответов 0
Метки нет (Все метки)

Фомирование из входного двоичного файла “cm.dat” сортированоой коллекции структур с двумя полями (char[8],short), упорялоченный по второму полю.
Структура cm.dat:
Двоичный файл “cm.dat” содержит 2 части:
- первая часть содержит количество параметров – 2 байта и список элементов структур (имя параметра – 8 байт, номер параметра – 2 байта, ссылка на тексты данного параметра – 2 байта);
- вторая часть файла содержит тексты параметров.
Нас интересует только информация первой части. Необходимо учесть, что числовые значения представлены в прямом коде.

Во-первых,после записи в структуру имя параметра отображается неправильно(то есть если сразу выводить имя параметра,то оно отображается верно). Во-вторых номер параметра отображается неправильно. Хотя,когда считываю первые 2 байта с количеством параметров,то количество верное.

Вот программа:
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
#pragma once
 
#include <fstream>
#include "objects.h"
#include <iostream>
#include "string.h"
#include "conio.h"
#include <sstream>
#include <string>
#include <cstdint>
 
using namespace std;
 
struct cm
    {
        char* a;
        unsigned short b;
    };
 
class MyCollection :
    public sortedCollection
{
public:
MyCollection(cc_Index limit, cc_Index delta) : sortedCollection(limit, delta) {
 
 
            duplicates = True;
 
        }
        virtual void *keyOf( void *item )
        {
            return &(((cm*)item)->b);
        }
 
        virtual int compare (void *k1, void *k2 )
            {
                return *((unsigned short*)k1) - *((unsigned short*)k2);
                
            } 
 
            
        
        void print(ofstream& f1){
            f1<<"Q="<<count<<endl;
            cm* dat;
            for( int i = 0; i < count; i++ ){
                dat = (cm *)at(i);
                f1   << dat->a << " " << dat->b << endl;
            }
            f1.close();
        }
 
};
 
 
void main()
{
    char buf[8]; 
    unsigned short count;
    ofstream f1("cm.txt");
    ifstream file("CM.dat",ios::binary);
    if (!file)
    {
        cout<<"error"<<endl;
    }
    else
    {
        cout<<"OK"<<endl;
    }
    MyCollection msc(4,2);
    file.read(buf,2);
    count = (buf[0]<<8) | (buf[1]);
    cout<<count<<endl;
    _getch();   
    for (int i = 0; i < count ; i++)
    {
        cm* dat = new cm();
        file.read(buf,8);
        for (int j = 0; j < 8; j++)
        {
            if (buf[j] == ' ')
            buf[j] = 0;
            
        }
        dat->a = new char[9];
        strcpy(dat->a,buf);
        file.read(buf,2);
        unsigned short a;
        a = (buf[0]<<8) | (buf[1]);
        dat->b = a;
        file.read(buf,2);   
        msc.insert(dat);
    }
    
 
    file.close();
    msc.print(f1);
    
     _getch();
 
}
Добавлено через 1 час 13 минут
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2015, 19:31
Ответы с готовыми решениями:

Работа с двоичным файлом
Условие: Дан файл, представляющий собой телефонную книжку некоторого молодого человека, т.е....

Работа с двоичным файлом
Ребят помогите. Создать двоичный файл и записать в него степени числа 3. Вывести на экран...

Работа с двоичным файлом: Перевести содержание файла в поток байт
Существует файл D:\proba.txt в себе он содержит: 68 11 00 00 00 00 71 00 00 00 09 01 C8 01 00 00...

работа с двоичным кодом
Задача не сложная но материала на ту тему Я на просторах интернета так и не нашел( Через небольшую...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2015, 19:31

Битовые поля и работа с двоичным числом без логических операций
Есть 2 числа. Например, 10110 и 11100 в дв. сист. сч. Нужно разряд первого числа сравнить с тем...

GUI Работа с текстовым файлом, лог файлом не мешая системе
Хочу написать прогу которая будет по таймеру искать в тхт - лог файле сообщение об ошибке. Например...

Является двоичным файлом, а не текстовым
'C:\Users\\\\\Resources\template.mdb&quot; является двоичным файлом, а не текстовым. Не знаю как...

CS2015 - Является двоичным файлом, а не текстовым
Здравствуйте! При компиляции программы возникла ошибка: Ошибка CS2015 'E:\Around the World\Around...

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают нормально. Вставляю...

Работа с матрицей. Работа с файлом
Обновить в входном файле данные строк/столбцов; выбор строки/столбца и позиция строки/столбца...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru