Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 2
Регистрация: 24.12.2017
Сообщений: 50

Открытие аудио/текстовых файлов

28.04.2018, 22:09. Показов 2033. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код будет служить для стеганографии в аудио файлах, но на данном этапе еще сырой.
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <string>
#include <cmath>
#include <Windows.h>
struct WAVHEADER
{
    char chunkId[4];
    unsigned long chunkSize;//4
    char format[4];
 
    // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
    // Подцепочка "fmt " описывает формат звуковых данных:
 
    // Содержит символы "fmt "
    // (0x666d7420 в big-endian представлении)
    char subchunk1Id[4];
 
    // 16 для формата PCM.
    // Это оставшийся размер подцепочки, начиная с этой позиции.
    unsigned long subchunk1Size;//4
 
    // Для PCM = 1 (то есть, Линейное квантование).
    // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
    unsigned short audioFormat;//2
 
    // Количество каналов. Моно = 1, Стерео = 2 и т.д.
    unsigned short numChannels;//2
 
    // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
    unsigned long sampleRate;//4
 
    // sampleRate * numChannels * bitsPerSample/8
    unsigned long byteRate;//4
 
    // numChannels * bitsPerSample/8
    // Количество байт для одного сэмпла, включая все каналы.
    unsigned short blockAlign;//2
 
    // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
    unsigned short bitsPerSample;//2
 
    // Подцепочка "data" содержит аудио-данные и их размер.
 
    // Содержит символы "data"
    // (0x64617461 в big-endian представлении)
    char subchunk2Id[4];
 
    // numSamples * numChannels * bitsPerSample/8
    // Количество байт в области данных.
    unsigned long subchunk2Size;//4
 
    // Далее следуют непосредственно Wav данные.
};
 
class AudioChecker
{
public:
    friend bool operator==(const AudioChecker& left, const int& right);
    bool vote = 0;
    bool audioChecker(WAVHEADER &header)
    {
        try {
            if (header.audioFormat != 1)
            {
                throw 1;
                vote = 1;
                return 1;
            }
            if (!(header.sampleRate == 44100 || header.sampleRate == 22050 || header.sampleRate == 11025 || header.sampleRate == 8000))
            {
                throw 2;
                vote = 1;
                return 1;
            }
            if (header.numChannels != 1)
            {
                throw 3;
                vote = 1;
                return 1;
            }
            if (header.bitsPerSample != 16)
            {
                throw 4;
                vote = 1;
                return 1;
            }
            std::cout << "Частота дискретизации: " << header.sampleRate << std::endl;
            std::cout << "Количество каналов: " << header.numChannels << std::endl;
            std::cout << "Разрядность файла: " << header.bitsPerSample << std::endl;
        }
        catch (int e)
        {
            if (e == 1)
            {
                std::cout << "Файл сжат" << std::endl;
            }
            if (e == 2)
            {
                std::cout << "Некорректная частота дискретизации" << std::endl;
            }
            if (e == 3)
            {
                std::cout << "Некорректное число каналов" << std::endl;
            }
            if (e == 4)
            {
                std::cout << "Некорректная разрядость файла" << std::endl;
            }
        }
        return 0;
    }
};
bool operator==(const AudioChecker& left, const int& right)
{
    return left.vote == right;
}
 
class Hider :public AudioChecker
{
private:
    char *audioWay;
    char *textWay;
    char *audioOutWay;
    byte *bytes;
public:
    Hider(char *a, char *b, char *c) : audioWay(a), textWay(b), audioOutWay(c) {};
    void hide()
    {
        WAVHEADER header;
        FILE *file;
        fopen_s(&file, audioWay, "r");
        fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
        vote = audioChecker(header);
        if (vote == 0)
        {
            int i = 0;
            fseek(file, sizeof(WAVHEADER), SEEK_SET);
            bytes = new byte[header.subchunk2Size];
            byte b;
            while (!feof(file))
            {
                fread_s(&b, 1, 1, 1, file);
                bytes[i] = b;
                i++;
                std::cout << bytes[i] << " ";
                fseek(file, b, SEEK_CUR);
            }
            FILE *file1;
            fopen_s(&file1, textWay, "r");
            char element;
            std::string s;
            while (!feof(file1))
            {
                fread_s(&element, 1, 1, 1, file1);
                s += element;
                fseek(file1, 1, SEEK_CUR);
            }
            std::cout << s << std::endl;
            if (s.size() <= i)
            {
                byte mask = 254;
                byte mask1 = 1;
                byte stego;
                for (int k = 0; k < i; k++)
                {
                    stego = s[k] & mask1;
                    bytes[k] = bytes[k] & mask;
                    bytes[k] = stego | bytes[k];
                }
            }
            else
                std::cout << "Wrong text length\n";
        }
        fclose(file);
    }
};
 
int main()
{
    setlocale(LC_ALL, ".1251");
    char *d, *e, *k;
    std::string a, b, c;
    std::cin >> a >> b >> c;
    d = new char[a.size()];
    e = new char[b.size()];
    k = new char[c.size()];
    for(int i=0;i<a.size();i++)
        d[i] = a[i];
    for (int i = 0; i<b.size(); i++)
        e[i] = b[i];
    for (int i = 0; i<c.size(); i++)
        k[i] = c[i];
    Hider q(d, e, k);
    q.hide();
    return 0;
}
Проблемы возникают в строках 136, 137. Ошибка выводится через раз, т.е. 1 раз файл открывает, другой раз-нет(файл тот же) с чем это может быть связано? И не могли бы Вы просмотреть класс Hider на предмет правильности ввода в файл?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2018, 22:09
Ответы с готовыми решениями:

Редактор TAG`ов аудио файлов
Добрый день. Скажу честно: препод сказал сделаешь программу(или найдешь в инете) &quot;редактор tag`ов аудио файлов&quot; объяснишь ее,...

Копирование текстовых файлов
Столкнулся с такой проблемой : при копировании из одного файла в другой мне нужно исключить(пропустить) слова, которые начинаются на букву,...

Перекодировка текстовых файлов
Всем привет. По курсовому проекту возник вопрос. Я попытался сначала сделать на Delphi, всё вышло. Сейчас пытаюсь сделать на С++ ...

26
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.04.2018, 08:48
Студворк — интернет-сервис помощи студентам
C++
1
std::ifstream file(audioWay, std::ifstream::binary);
1
1 / 1 / 2
Регистрация: 24.12.2017
Сообщений: 50
30.04.2018, 09:02  [ТС]
пробую читать так:
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>
#include <string>
#include <cmath>
#include <Windows.h>
#pragma pack (push, 1)
struct WAVHEADER
{
    char chunkId[4];
    unsigned long chunkSize;//4
    char format[4];
 
    // Формат "WAVE" состоит из двух подцепочек: "fmt " и "data":
    // Подцепочка "fmt " описывает формат звуковых данных:
 
    // Содержит символы "fmt "
    // (0x666d7420 в big-endian представлении)
    char subchunk1Id[4];
 
    // 16 для формата PCM.
    // Это оставшийся размер подцепочки, начиная с этой позиции.
    unsigned long subchunk1Size;//4
 
                                // Для PCM = 1 (то есть, Линейное квантование).
                                // Значения, отличающиеся от 1, обозначают некоторый формат сжатия.
    unsigned short audioFormat;//2
 
                               // Количество каналов. Моно = 1, Стерео = 2 и т.д.
    unsigned short numChannels;//2
 
                               // Частота дискретизации. 8000 Гц, 44100 Гц и т.д.
    unsigned long sampleRate;//4
 
                             // sampleRate * numChannels * bitsPerSample/8
    unsigned long byteRate;//4
 
                           // numChannels * bitsPerSample/8
                           // Количество байт для одного сэмпла, включая все каналы.
    unsigned short blockAlign;//2
 
                              // Так называемая "глубиная" или точность звучания. 8 бит, 16 бит и т.д.
    unsigned short bitsPerSample;//2
 
                                 // Подцепочка "data" содержит аудио-данные и их размер.
 
                                 // Содержит символы "data"
                                 // (0x64617461 в big-endian представлении)
    char subchunk2Id[4];
 
    // numSamples * numChannels * bitsPerSample/8
    // Количество байт в области данных.
    unsigned long subchunk2Size;//4
 
                                // Далее следуют непосредственно Wav данные.
};
#pragma pack (pop)
 
class AudioChecker
{
public:
    friend bool operator==(const AudioChecker& left, const bool& right);
    bool vote = 0;
    bool audioChecker(WAVHEADER &header)
    {
        try {
            if (header.audioFormat != 1)
            {
                throw 1;
            }
            if (!(header.sampleRate == 44100 || header.sampleRate == 22050 || header.sampleRate == 11025 || header.sampleRate == 8000))
            {
                throw 2;
            }
            if (header.numChannels != 1)
            {
                throw 3;
            }
            if (header.bitsPerSample != 16)
            {
                throw 4;
            }
            std::cout << "Частота дискретизации: " << header.sampleRate << std::endl;
            std::cout << "Количество каналов: " << header.numChannels << std::endl;
            std::cout << "Разрядность файла: " << header.bitsPerSample << std::endl;
            return 0;
        }
        catch (int e)
        {
            if (e == 1)
            {
                std::cout << "Файл сжат" << std::endl;
                vote = 1;
                return 1;
            }
            if (e == 2)
            {
                std::cout << "Некорректная частота дискретизации" << std::endl;
                vote = 1;
                return 1;
            }
            if (e == 3)
            {
                std::cout << "Некорректное число каналов" << std::endl;
                vote = 1;
                return 1;
            }
            if (e == 4)
            {
                std::cout << "Некорректная разрядость файла" << std::endl;
                vote = 1;
                return 1;
            }
        }
    }
};
bool operator==(const AudioChecker& left, const bool& right)
{
    return left.vote == right;
}
 
class Hider :public AudioChecker
{
private:
    std::string audioWay;
    std::string textWay;
    std::string audioOutWay;
public:
    
    Hider(std::string a, std::string b, std::string c) : audioWay(a), textWay(b), audioOutWay(c) {};
    void hide()
    {
        WAVHEADER header;
        std::ifstream file(audioWay, std::ifstream::binary);
        if (!file)
            std::cout << "Невозможно открыть файл\n";
        else
        {
            file.read((char *)&header, sizeof(WAVHEADER));
            vote = audioChecker(header);
            if (vote == 0)
            {
                unsigned int i = 0;
                file.seekg(sizeof(WAVHEADER));
                byte bytes[10000];
                //bytes = new byte[header.subchunk2Size];
                while (true)
                {
                    if (!file.eof())
                    {
                        file >> bytes[i];
                        i++;
                    }
                    else
                    {
                        file.close();
                        break;
                    }
                }
 
                std::ifstream file1(textWay);
                if (!file1)
                    std::cout << "Невозможно открыть файл\n";
                else
                {
                    std::string s;
                    file1>>s;
                    if (s.size() <= i)
                    {
                        byte mask = 254;
                        byte mask1 = 1;
                        byte stego;
                        for (unsigned int k = 0; k < i; k++)
                        {
                            stego = s[k] & mask1;
                            bytes[k] = bytes[k] & mask;
                            bytes[k] = stego | bytes[k];
                        }
                    }
                    else
                        std::cout << "Wrong text length\n";
                }
            }
        }
    }
};
 
int main()
{
    setlocale(LC_ALL, ".1251");
    std::string a, b, c;
    std::cin >> a >> b >> c;
    Hider q(a, b, c);
    q.hide();
    return 0;
}
в строке 154 отладчик выдает ошибку: Необработанное исключение по адресу 0x00000100 в fake.exe: 0xC0000005: Access violation (параметры: 0x00000008).
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.04.2018, 09:18
И у тебя этот eof()? Откуда вы его берёте? Потом начнутся вопросы, откуда же лишний байт считывается.
Исправляй.
0
1 / 1 / 2
Регистрация: 24.12.2017
Сообщений: 50
30.04.2018, 09:22  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И у тебя этот eof()
а что с ним не так?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.04.2018, 09:25
eof() == true после первого неудачного чтения. Она не работает наперёд. А теперь посмотри на свой цикл и подумай.
1
1 / 1 / 2
Регистрация: 24.12.2017
Сообщений: 50
30.04.2018, 09:31  [ТС]
понял, переделал на запись сразу всего потока данных в 1 переменную, спасибо)
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
30.04.2018, 17:19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это не Си-шные. Это Майкрософты зачем-то написали свои аналоги для стандартных.
Что значит ошибка error C2660: strcpy_s: функция не принимает 2 аргументов?
http://en.cppreference.com/w/c/io
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Поэтому стоит использовать
Если правильно помню, нет гарантии, что везде будет работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.04.2018, 17:19

Конкатенация текстовых файлов
Доброго времени суток. Нужно объединить заданное количество текстовых файлов. Результат слияния заданных файлов должен быть отображен через...

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

Обработчик текстовых файлов
Добрый день,прошу помощи в этом нелегком(для меня ) задании ! Написать программу-обработчик текстовых файлов, создающую текстовый файл, в...

Обработка текстовых файлов
Я написал программу, которая выводит с файла допустим dfgdfg dfgdfg dfgdfg dfgdfg dfgdfg dfdfgdf Код: #include...

Обработка текстовых файлов
Помогите написать программу для заданного файла удалить все строки, яки начинаются с &quot;*&quot;. Результат сохранить в том же файли. ...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru