Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
#1

Расшифровка ТЗ - C++

03.07.2015, 14:57. Просмотров 769. Ответов 13
Метки нет (Все метки)

Простите, за идиотский вопрос, но я немного не понимаю, что здесь требуется. В общем, есть структура, и требуется написать файл с запросами на удаление из одного бинарного файла, насколько я понял. Но непонятно, какое оформление от меня требуется. Вот ТЗ:

Создать с клавиатуры файл для тестирования функции удаления данных
из бинарного файла. В каждую строку этого файла записать значение одного
из полей структур, по которому будет производиться поиск удаляемых
структур в бинарном файле.
Файл следует составить следующим образом:

- значение, равное полю последней структуры бинарного файла;
- отсутствие поискового признака (пустая строка);
- значение, не совпадающее с полями структур в бинарном файле;
- значение, совпадающее с полем первой структуры бинарного файла.
Структура, если нужна:
C++
1
2
3
4
5
6
7
8
struct Tour
{
    string name;
    string country;
    uint duration;
    uint price;
    string date;
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 14:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Расшифровка ТЗ (C++):

Расшифровка
как понять выражение: в классе должно быть поле данных, представленное...

Расшифровка
char key = "axe128bct"; //crypt key for(int i = 0; i<20; i++) newPsw =...

Расшифровка кода
Извеняюсь если создал тему не там. У меня возникла проблема вот в чём: —в® § ...

AES. Расшифровка
Допустим, у меня есть такие функции AES. /* алгоритм AES-256 размер блока -...

Расшифровка задания
Доброго времени суток. Только начал изучать работу с файлами, и либо это...

Расшифровка информации
Мне на кое каком форуме один чел сказал так: Оптоволоконная линия связи сама...

13
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
03.07.2015, 16:49 #2
Цитата Сообщение от tnk500 Посмотреть сообщение
Создать с клавиатуры файл для тестирования функции удаления данных
из бинарного файла. В каждую строку этого файла записать значение одного
из полей структур, по которому будет производиться поиск удаляемых
структур в бинарном файле.
Строки в бинарном файле? Я бы советовал пинать препода на тему более вразумительных формулировок. Действительно, непонятная муть какая-то.
0
IrineK
Заблокирован
03.07.2015, 17:35 #3
Делаете какое-то поле "ключевым".
Скажем, "страна".

Потом для создания тестировочного файла набиваете с консоли
страну последней записи - "Гондурас"
страну ни разу не попавшую в записи - "Амурика"
страну первой записи - "Египет"

В тестировочный файл нужно записать
Гондурас
___(пустая строка)
Амурика
Египет

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Я бы советовал пинать препода
Увы, студент идёт за "помощью".
А потом студент и преп вместе пинают фрилансера по принципу "Два дебила - это сила".

Вот отказались бы мы "помогать" хотя б на год, вся эта псевдосистема "образования" завалилась бы к чертовой бабушке )))
Мечты, мечты...

1
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
03.07.2015, 17:53  [ТС] #4
Цитата Сообщение от IrineK Посмотреть сообщение
А потом студент и преп вместе пинают фрилансера по принципу "Два дебила - это сила".
Я знаю, что именно это случится, если я напишу что-то по этому поводу, ибо даже мой маленький опыт фриланса говорит: "ТЗ закон, даже для написавшего его препода, так что в его верности он едва ли усомнится". В общем, я уговорил-таки заказчика сменить способ выбора удаления (даже с вашей, IrineK, формулировкой я его не понел).

Кстати говоря, возникла проблема насчет чтения бинарного файла. Вот функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool readBinary(string fileName)
{
    ifstream ifs(fileName, std::ios::binary | std::ios::in);
    if (!ifs)
        return 0;
 
    Tour* tr = NULL;
 
    while (1)
    {
        ifs.read((char*)tr, sizeof(*tr));
        if (ifs.eof())
            break;
        cout << *tr << std::endl;
    } 
        
        // здесь
    tr = NULL;
    ifs.close();
    return true;
}
Как видно, я использую указатель. Если бы это была обычная переменная, во время выхода из функции возникла бы ошибка неверного доступа. Функция верно используется? Думаю, память, располагавшаяся до коммента, не вычищается из оперативной памяти, что есть плохо.
0
SherHun
30 / 30 / 22
Регистрация: 22.06.2015
Сообщений: 102
03.07.2015, 17:56 #5
Цитата Сообщение от tnk500 Посмотреть сообщение
Думаю, память, располагавшаяся до коммента, не вычищается из оперативной памяти, что есть плохо.
Может книжку открыть, почитать, а потом во фриланс
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
03.07.2015, 18:03  [ТС] #6
SherHun, увы, жизненные обстоятельства говорят обратное. По правде, я всего пару книг прочел по плюсам, и то, это было давно. Приходится так и учиться, на форуме да в интернете. Так что насчет указателя? Я вот что имел в виду, адрес, по которому располагалась информация о прочитанной структуре, теряется в 18 строчке. И компилятор не вычищает ту, на которую раньше указывал указатель.
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
03.07.2015, 18:10 #7
Цитата Сообщение от tnk500 Посмотреть сообщение
Как видно, я использую указатель.
Нулевой (читай, "любое обращение к нему генерирует ошибку доступа"). Кто вам сказал что read само выделит память под прочитанные данные?
0
Krasiosoft
51 / 51 / 23
Регистрация: 01.06.2015
Сообщений: 189
03.07.2015, 18:18 #8
Скорей всего нужно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool readBinary(string fileName)
{
    ifstream ifs(fileName, std::ios::binary | std::ios::in);
    if (!ifs)
        return 0;
 
    Tour tr;
 
    while (1)
    {
        ifs.read((char*)&tr, sizeof(tr));
        if (ifs.eof())
            break;
        cout << tr << std::endl;
    }         
    ifs.close();
    return true;
}
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
03.07.2015, 18:30  [ТС] #9
Renji, Krasiosoft, по правде, тот код я послал случайно, сам не заметил, и начал его описывать. На деле я выделял память под указатель, но все равно возникает ошибка при вызове delete. И обычная переменная не исправляет дела; в обоих случаях, как мне кажется, компилятор пытается очистить память, но это у него не получается.

Что же со структурой? Может, я неправильно читаю ее из файла?

Добавлено через 2 минуты
Может, до того как установить поток на eof функция read делает что-то с адресом переменной tr?
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
03.07.2015, 18:49 #10
Цитата Сообщение от tnk500 Посмотреть сообщение
Что же со структурой? Может, я неправильно читаю ее из файла?
У вас в Tour стринги лежат. Они через read не читаются, потому как имеют не тривиальный конструктор. Читайте поля через >> по одному.
1
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
03.07.2015, 18:53  [ТС] #11
Renji, вот оно что. Но разве можно таким образом читать бинарные файлы?
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
03.07.2015, 19:23 #12
Цитата Сообщение от tnk500 Посмотреть сообщение
Renji, вот оно что. Но разве можно таким образом читать бинарные файлы?
За << и >> отвечают istream и ostream. А они про существование файлов ничего не знают и работают с абстрактным потоком. Поэтому что вообще делает std::ios::binary и нахрена он нужен - великая тайна есть. Кажется, он должен отключать платформозависимый выбор символа конца строки. Но чтоб избежать придирок к формату, числа лучше дальше читать/писать через read/write.

Впрочем, если вам нужно запихать в стринг спец-символы типа конца строки, то работать через >> и << уже не выйдет и придется попрыгать с бубном (отдельно сохранить размер стринга, отдельно его содержимое в форме массива символов).
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
03.07.2015, 19:24  [ТС] #13
Renji, нет, проблема не в том. Фишка в том, что после чтения записи выводится, все прекрасно читается, программа вылетает когда функция полностью заканчивает свою работу и, очевидно, пытается освободить ресурсы. И да, через оператор >> прочесть двоичный файл не удастся.

Цитата Сообщение от Renji Посмотреть сообщение
std::ios::binary и нахрена он нужен - великая тайна есть
Я вот тоже понять не могу. Жаль, что не могу пнуть препода, он далеко(
0
Renji
2129 / 1488 / 453
Регистрация: 05.06.2014
Сообщений: 4,329
03.07.2015, 19:32 #14
Цитата Сообщение от tnk500 Посмотреть сообщение
И да, через оператор >> прочесть двоичный файл не удастся.
Все удастся, если читать тем же методом что и писать.
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
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
 
int main()
{
    int number=100;
    std::string str="abcd";
 
    ofstream out;
    out.open("test.txt",ios_base::out|ios_base::binary);
    out.write((char*)&number,sizeof(number));
    out<<str;
    out.close();
 
    ifstream in;
    in.open("test.txt",ios_base::in|ios_base::binary);
    in.read((char*)&number,sizeof(number));
    in>>str;
    in.close();
 
    cout<<number<<endl<<str<<endl;
    return 0;
}
1
03.07.2015, 19:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 19:32
Привет! Вот еще темы с решениями:

Расшифровка Морзе
Делаю шифрование азбукой Морзе. Зашифровка готова, а вот с расшифровкой...

Расшифровка синтаксиса
есть код сlass Foo { public: Foo() : i(0) { std::cout &lt;&lt;...

Расшифровка массива
Массив зашифрован следующим образом: по заданным элементам исходного массива из...

расшифровка операторов
Добрый день. Хотелось бы спросить у людей которые давно работают на С++. Кто...


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

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

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