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

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

Восстановить пароль Регистрация
 
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,211
Завершенные тесты: 3
03.07.2015, 14:57     Расшифровка ТЗ #1
Простите, за идиотский вопрос, но я немного не понимаю, что здесь требуется. В общем, есть структура, и требуется написать файл с запросами на удаление из одного бинарного файла, насколько я понял. Но непонятно, какое оформление от меня требуется. Вот ТЗ:

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

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

нужна расшифровка C++
C++ Расшифровка массива
Расшифровка C++
C++ Расшифровка
AES. Расшифровка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
03.07.2015, 16:49     Расшифровка ТЗ #2
Цитата Сообщение от tnk500 Посмотреть сообщение
Создать с клавиатуры файл для тестирования функции удаления данных
из бинарного файла. В каждую строку этого файла записать значение одного
из полей структур, по которому будет производиться поиск удаляемых
структур в бинарном файле.
Строки в бинарном файле? Я бы советовал пинать препода на тему более вразумительных формулировок. Действительно, непонятная муть какая-то.
IrineK
Заблокирован
03.07.2015, 17:35     Расшифровка ТЗ #3
Делаете какое-то поле "ключевым".
Скажем, "страна".

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

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

Не по теме:

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

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

tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,211
Завершенные тесты: 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;
}
Как видно, я использую указатель. Если бы это была обычная переменная, во время выхода из функции возникла бы ошибка неверного доступа. Функция верно используется? Думаю, память, располагавшаяся до коммента, не вычищается из оперативной памяти, что есть плохо.
SherHun
 Аватар для SherHun
29 / 29 / 15
Регистрация: 22.06.2015
Сообщений: 102
03.07.2015, 17:56     Расшифровка ТЗ #5
Цитата Сообщение от tnk500 Посмотреть сообщение
Думаю, память, располагавшаяся до коммента, не вычищается из оперативной памяти, что есть плохо.
Может книжку открыть, почитать, а потом во фриланс
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,211
Завершенные тесты: 3
03.07.2015, 18:03  [ТС]     Расшифровка ТЗ #6
SherHun, увы, жизненные обстоятельства говорят обратное. По правде, я всего пару книг прочел по плюсам, и то, это было давно. Приходится так и учиться, на форуме да в интернете. Так что насчет указателя? Я вот что имел в виду, адрес, по которому располагалась информация о прочитанной структуре, теряется в 18 строчке. И компилятор не вычищает ту, на которую раньше указывал указатель.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
03.07.2015, 18:10     Расшифровка ТЗ #7
Цитата Сообщение от tnk500 Посмотреть сообщение
Как видно, я использую указатель.
Нулевой (читай, "любое обращение к нему генерирует ошибку доступа"). Кто вам сказал что read само выделит память под прочитанные данные?
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 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;
}
tnk500
113 / 117 / 25
Регистрация: 25.08.2012
Сообщений: 1,211
Завершенные тесты: 3
03.07.2015, 18:30  [ТС]     Расшифровка ТЗ #9
Renji, Krasiosoft, по правде, тот код я послал случайно, сам не заметил, и начал его описывать. На деле я выделял память под указатель, но все равно возникает ошибка при вызове delete. И обычная переменная не исправляет дела; в обоих случаях, как мне кажется, компилятор пытается очистить память, но это у него не получается.

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

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

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

Цитата Сообщение от Renji Посмотреть сообщение
std::ios::binary и нахрена он нужен - великая тайна есть
Я вот тоже понять не могу. Жаль, что не могу пнуть препода, он далеко(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 19:32     Расшифровка ТЗ
Еще ссылки по теме:

Расшифровка задания C++
C++ Расшифровка кода
Расшифровка информации C++

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

Или воспользуйтесь поиском по форуму:
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
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;
}
Yandex
Объявления
03.07.2015, 19:32     Расшифровка ТЗ
Ответ Создать тему
Опции темы

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