Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708

Как добавить в массив элементы

03.07.2019, 23:19. Показов 1129. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, есть файл. Его надо считать дополнить до нужной длины. Чтобы длина файла была кратна 128. Дальше нужно разбить на блоки по восемь байт и вставить по восемь байтов, где будет записан номер блока. Нумеровать блоки с конца. Как вставить элементы в массив и пронумеровать блоки с конца.
Код:
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <locale.h>
 
 
int main()
{
    setlocale(LC_ALL, "rus");
    int size, sizeB, i, padding;
    unsigned char *a, *b;
    int countAdd = 0;
    int length = 64;
    int lengthData = 0;
    char tmp;
    FILE *ptr;
    ptr = fopen("D:\\ini.bin", "rb");
    if(ptr == NULL)
    {
        perror("Не удается открыть файл ini.bin");
        return 1;
    }
    fseek(ptr, 0, SEEK_END);
    size = ftell(ptr); 
    fseek(ptr, 0, SEEK_SET);
    countAdd = size - (size / length) * length; 
    sizeB = (1+(size/length))*length;
    a = (unsigned char*)malloc(size * (sizeof(unsigned char)));
    b = (unsigned char*)malloc(sizeB * (sizeof(unsigned char)));
        
    for(i = 0; i < size; i++)
    {
        a[i] = fgetc(ptr);
    }
    
    for(i = 0; i < size; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
    for( i =0; i < size/2; i++)
    {
        tmp = a[i];
        a[i]=a[size-i-1];
        a[size-i-1] = tmp;
 
    }
    for(i = 0; i < size; i++)
    {
        printf("%d ", a[i]);
    }
    padding = sizeB - size;
    if (padding) {
        memset(b, 0x00, padding - 1);
        memcpy(b + padding, a, size);
    }
    printf("\n");
    for(i = 0; i < sizeB; i++)
    {
        printf("%d ", b[i]);
    }
 
    return 0;
}
Вложения
Тип файла: rar ini.rar (186 байт, 4 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2019, 23:19
Ответы с готовыми решениями:

Как добавить элементы списка в массив?
Добрый вечер. Прошу помощи, необходимо вводимые элементы списка одновременно добавлять в массив. &lt;!DOCTYPE html&gt; ...

Как добавить элементы формы в массив?
Здравствуйте, есть html - форма : &lt;form action=&quot;#&quot; method=&quot;GET&quot;&gt; &lt;input type=&quot;text&quot; name=&quot;0&quot; /&gt; &lt;input...

Как добавить элементы 1-го и 2-го массива в 3-ий массив
int n,m; int a=new int; System.out.println(&quot; a: &quot;); n=Integer.parseInt(in.readLine()); System.out.println(&quot;Е. а: &quot;); ...

8
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
04.07.2019, 17:07  [ТС]
С помощью realloc'a дополняю до длины 256. теперь надо разбить на блоки по 8 байт. После каждых восьми байт вставляется индекс блока длиной 8 байт.
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
04.07.2019, 19:05
Andy_Coldfield, вы неправильно находите размер файла. Установка указателя на SEEK_END для бинарных файлов — неопределенное поведение:

A binary stream need not meaningfully support fseek calls with a whence value of SEEK_END.
Можете сделать как-то так (нужно тестить):

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
 
static size_t fsize(const char *fname)
{
    struct stat st;
    stat(fname, &st);
 
    return (size_t) st.st_size;
}
 
int main(void)
{
    static const char   INPUT_FILENAME[] = "input.bin";
    static const char   OUTPUT_FILENAME[] = "output.bin";
    static const size_t RESULT_SIZE_MULTIPLIER = 128;
    static const size_t BLOCK_SIZE = 8;
 
    FILE *input = fopen(INPUT_FILENAME, "rb");
 
    /* Вычислям размер файла и то, насколько его нужно дополнить, чтобы
     * размер стал кратен RESULT_SIZE_MULTIPLIER:
     */
    const size_t filesize = fsize(INPUT_FILENAME);
    const size_t padding = ((filesize / RESULT_SIZE_MULTIPLIER) + 1) * RESULT_SIZE_MULTIPLIER - filesize;
 
    /* Считываем содержимое файла в буфер data. Размер data уже дополнен,
     * дополненные байты установлены в 0x00 функцией calloc:
     */
    unsigned char *data = calloc(1, filesize + padding);
    unsigned char *data_save = data;
    fread(data, 1, filesize, input);
 
    /* Считаем количество блоков в файле: 
     */
    const unsigned int nblocks = (filesize + padding) / BLOCK_SIZE;
 
    FILE *output = fopen(OUTPUT_FILENAME, "wb");
 
    /* Записываем каждый блок в выходной файл в формате: 
     *
     *      [<номер-блока-с-конца-8-байт><содержимое блока-8-байт>]
     */
    for (size_t i = nblocks; i-- > 0;) {
        unsigned char block_idx[BLOCK_SIZE] = {0};
        memcpy(block_idx, &i, sizeof i);
 
        fwrite(block_idx, 1, sizeof block_idx, output);
        fwrite(data, 1, BLOCK_SIZE, output);
 
        data += BLOCK_SIZE;
    }
 
    free(data_save);
    fclose(input);
    fclose(output);
}
Я использовал функции POSIX для вычисления размера файла. В Windows можете воспользоваться функцией GetFileSizeEx.
1
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
04.07.2019, 23:01  [ТС]
Eanmos, только я на плюсах хочу это реализовать) подскажите как лучше, пожалу ста.
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
04.07.2019, 23:26
Andy_Coldfield, тогда советую посмотреть в сторону C++17 Filesystem и вообще в сторону STL.
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
06.07.2019, 12:38  [ТС]
Eanmos, STL это стандартная библиотека для с++?

Добавлено через 3 минуты
Eanmos, а как на плюсах считать и записать в массив?
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
06.07.2019, 15:18
Andy_Coldfield, да, STL — это стандартная библиотека шаблонов. Касательно второго вопроса, лучше воспользуйтесь std::vector:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
 
int main()
{
    /* Считываем число с stdin... */
    int buffer = 0;
    std::cin >> buffer;
 
    /* ... и добавляем его в вектор. */
    std::vector<int> v;
    v.push_back(buffer);
}
1
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
07.07.2019, 12:19  [ТС]
Eanmos, а как файл считать и запихнуть в вектор?
0
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
07.07.2019, 14:45
Andy_Coldfield,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
 
int main()
{
    /* Открываем файл для чтения: */
    std::ifstream file("input.txt");
 
    /* Создаем вектор строк: */
    std::vector<std::string> lines;
 
    /* Считываем файл по-строчно в вектор: */
    for (std::string line; std::getline(file, line); )
        lines.push_back(line);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.07.2019, 14:45
Помогаю со студенческими работами здесь

Как добавить в массив все элементы <string> из strings.xml ?
Нужно добавить в строковый массив все элементы &lt;string&gt; из .xml файла со строками, как это сделать?

Массив: Сравнить два массива и добавить в массив two недостающие элементы
В примере 1, есть два таких массива: //Первый ftpClient.changeWorkingDirectory(&quot;\\hel\\xl\\one\&quot;); FTPFile files =...

Задан массив AX (N). Добавить массив С(К). Выполнить сортировку включением. В полученном массиве поменяйте местами наибольший и наименьший элементы
1. Задан массив AX (N). Добавить массив С(К). Выполнить сортировку включением. В полученном массиве поменяйте местами наибольший и...

Добавить элементы в массив
в одномерном массиве добавить элементы решите в с++ попроще

В строковой массив добавить элементы
Всем привет, ломаю голову над одной проблемой: Дан массив, в котором строка: char S = {f,o,r, ,p,r,o,g,r,a,m} Нужно после символа 'r'...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru