Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42

Сортировка в бинарных файлах

13.08.2014, 13:18. Показов 12019. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть у меня один вопрос. Дано 2 бинарных файла. Один из них отсортирован по возрастанию, второй - по убыванию. Записать всё в третий файл по убыванию без дополнительных массивов.
Как это сделать? Посоветуйте что-нибудь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2014, 13:18
Ответы с готовыми решениями:

Структуры в бинарных файлах
При выводе работника выдает ошибка при выводе элементов, которые хранятся как тип данных char #include "iostream" #include...

Поиск и замена в бинарных файлах
Помогите, пож., двоечнику решить задачу Имеется некое множество бинарных файлов, отличающихся по наименованию и размеру. В каждом из них...

Сравнение матриц в бинарных файлах
Добрый вечер, хотел бы задать немного вопросов по своей задачке. Сама задачка: Есть 2 файла, в первом - N матриц, во втором - M...

14
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
13.08.2014, 16:28
Считывать в два буфера из одного файла с начала, а со второго с конца. Записывать содержимое буферов по убыванию.
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
13.08.2014, 16:28
Сделай массив размером 256 (по количеству возможных состояний байта) и подсчитывай количество байтов.
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
13.08.2014, 16:51  [ТС]
Спасибо! Но тут же в задании написано не использовать дополнительные массивы. Хотя ладно. Еще раз спасибо.
0
431 / 385 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
13.08.2014, 17:47
Слово "дополнительный" предполагает, что есть еще и "основной". А в задании файлы, а не массивы. Может, предполагается, что файлы можно считывать в массивы, но дополнительных массивов (кроме этих двух, которые для двух файлов) делать нельзя? Вообще, какое-то несуразное, малопонятное задание, явно высосанное пальца.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
14.08.2014, 12:29
В защиту своего высказывания скажу, что не нужно использовать дополнительный именно массив. Необходимы две переменные под буферы.

А вообще по хорошему, если нельзя ничего использовать дополнительного, то дописать одному файлу в конец второй, отсортировать его, используя как буфер второй файл, и записать со спокойной совестью в третий.
2
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
14.08.2014, 15:55  [ТС]
Хм, имеет смысл.
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
21.08.2014, 17:36  [ТС]
И еще вопрос: а как считывать файл с конца, а то информации в интернете не нашел. Можете объяснить?
0
318 / 180 / 73
Регистрация: 18.01.2014
Сообщений: 387
21.08.2014, 18:39
Цитата Сообщение от Creder23 Посмотреть сообщение
как считывать файл с конца
C
1
2
3
4
5
6
7
8
9
10
FILE *fd = fopen("in.bin", "rb");
fseek(fd, 0, SEEK_END);
int val;
while (ftell(fd) > 0) {
    fseek(fd, -sizeof(val), SEEK_CUR);
    fread(&val, sizeof(val), 1, fd);
    fseek(fd, -sizeof(val), SEEK_CUR);
    printf("%d ", val);
}
fclose(fd);
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
22.08.2014, 01:24  [ТС]
А я пытался что-то типа этого
C
1
fread(&n, -sizeof(int), 1, f);
0
318 / 180 / 73
Регистрация: 18.01.2014
Сообщений: 387
22.08.2014, 09:43
Как вариант:
C
1
2
3
4
5
6
7
8
9
FILE *f = fopen("in.bin", "rb");
...
int n, i = 0;
fseek(f, 0, SEEK_END);
while (ftell(f) > sizeof(int)) {
    fseek(f, --i * sizeof(int), SEEK_END);
    fread(&n, sizeof(int), 1, f);
    printf("%d ", n);
}
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
22.08.2014, 19:53  [ТС]
Ну, в общем, что-то сделал, но программа выполняется бесконечно. Закрываю и нахожу третий файл размером под десяток мегабайт. Что не так сделал?
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
#include <stdlib.h>
#include <stdio.h>
#define N 4
 
 
int main(){
    FILE *f1, *f2, *f3;
    int n1, n2, i, m, l=0;
    int d1[N]={1,3,5,7};
    int d2[N]={9,8,6,5};
    f1=fopen("file1.bin", "wb+");
    f2=fopen("file2.bin", "wb+");
    f3=fopen("file3.bin", "wb+");
 
    for(i=0; i<N; i++){
        fwrite(&d1[i], sizeof(int), 1, f1);
        }
    for(i=0; i<N; i++){
        fwrite(&d2[i], sizeof(int), 1, f2);
    }
 
 
    rewind(f1);
    rewind(f2);
 
    fread(&n1, sizeof(int), 1, f1);
    fseek(f2, -sizeof(int), SEEK_END);
    fread(&n2, sizeof(int), 1, f2);
 
    while(!feof(f1) || ftell(f2)!=0){
            if(n1<n2){
                while(ftell(f2)>0 && n1<n2){
                    fwrite(&n2, sizeof(int), 1,f3);
                    fseek(f2, --l*sizeof(int), SEEK_END);
                    fread(&n2, sizeof(int), 1, f2);
                }
                if(ftell(f2)==0 && n1<n2){
                    fwrite(&n2, sizeof(int), 1, f3);
                }
            }
 
            else{
                while(!feof(f1) && n1>n2){
 
                    fwrite(&n1, sizeof(int), 1, f3);
                    fread(&n1, sizeof(int), 1, f1);
                }
                if(feof(f1) && n1>n2){
                    fwrite(&n1, sizeof(int), 1, f3);
                }
            }
 
    }
    fclose(f1);
    fclose(f2);
 
    rewind(f3);
    while(!feof(f3)){
        fread(&m, sizeof(int), 1, f3);
        printf("%d", m);
    }
    fclose(f3);
 
 
}
0
318 / 180 / 73
Регистрация: 18.01.2014
Сообщений: 387
22.08.2014, 22:34
Цитата Сообщение от Creder23 Посмотреть сообщение
Что не так сделал?
ХЗ. Очень сложную логику накрутили с циклами внутри циклов. Может есть смысл разделить циклы, т.е. пока есть возможность читать из обоих файлов, читаем из обоих, а потом просто читаем остаток из того, который еще весь не прочитан? Примерно так:
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
fread(&n1, s, 1, f1);
fseek(f2, 0, SEEK_END);
if (e = ftell(f2)) {
    fseek(f2, -s, SEEK_CUR);
    fread(&n2, s, 1, f2);
    fseek(f2, -s, SEEK_CUR);
}
while (!feof(f1) && e) {
    if (n1 < n2) {
        printf("%d ", n1);
        fread(&n1, s, 1, f1);
    } else {
        printf("%d ", n2);
        if (e = ftell(f2)) {
            fseek(f2, -s, SEEK_CUR);
            fread(&n2, s, 1, f2);
            fseek(f2, -s, SEEK_CUR);
        }
    }
}
while (!feof(f1)) {
    printf("%d ", n1);
    fread(&n1, s, 1, f1);
}
while (e) {
    printf("%d ", n2);
    if (e = ftell(f2)) {
        fseek(f2, -s, SEEK_CUR);
        fread(&n2, s, 1, f2);
        fseek(f2, -s, SEEK_CUR);
    }
}
Здесь s = sizeof(int), е -- дополнительный флаг для обратного чтения.
0
0 / 0 / 4
Регистрация: 18.11.2013
Сообщений: 42
25.08.2014, 14:20  [ТС]
Спасибо. Все работает.
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
#include <stdlib.h>
#include <stdio.h>
#define N 5
 
 
int main(){
    FILE *f1, *f2, *f3;
    int n1, n2, i, e, s=sizeof(int), m;
    int d1[N]={9,8,7,6,5};
    int d2[N]={0,1,2,3,4};
    f1=fopen("file1.bin", "wb+");
    f2=fopen("file2.bin", "wb+");
    f3=fopen("file3.bin", "wb+");
 
    for(i=0; i<N; i++){
        fwrite(&d1[i], s, 1, f1);
        }
    for(i=0; i<N; i++){
        fwrite(&d2[i], s, 1, f2);
    }
 
 
    rewind(f1);
    rewind(f2);
 
    fread(&n1, s, 1, f1);
    fseek(f2, 0, SEEK_END);
 
    if (e = ftell(f2)) {
        fseek(f2, -s, SEEK_CUR);
        fread(&n2, s, 1, f2);
        fseek(f2, -s, SEEK_CUR);
    }
 
    while (!feof(f1) && e) {
        if (n1 > n2) {
            fwrite(&n1, s, 1, f3);
            fread(&n1, s, 1, f1);
        }
        else {
            fwrite(&n2, s, 1, f3);
            if (e = ftell(f2)) {
                fseek(f2, -s, SEEK_CUR);
                fread(&n2, s, 1, f2);
                fseek(f2, -s, SEEK_CUR);
            }
        }
    }
 
    while (!feof(f1)) {
        fwrite(&n1, s, 1, f3);
        fread(&n1, s, 1, f1);
}
 
    while (e) {
        fwrite(&n2, s, 1, f3);
        if (e = ftell(f2)) {
            fseek(f2, -s, SEEK_CUR);
            fread(&n2, s, 1, f2);
            fseek(f2, -s, SEEK_CUR);
        }
    }
 
    rewind(f3);
    while(!feof(f3)){
        fread(&m, s, 1, f3);
        printf("%d", m);
    }
    fclose(f3);
 
 
}
Ну и последний вопрос. Почему, когда я считываю числа из третьего файла для проверки, 2 раза пишется последнее число?
0
318 / 180 / 73
Регистрация: 18.01.2014
Сообщений: 387
25.08.2014, 14:48
Цитата Сообщение от Creder23 Посмотреть сообщение
Почему, когда я считываю числа из третьего файла для проверки, 2 раза пишется последнее число?
Потому, что
C
1
2
3
4
5
fread(&m, s, 1, f3); // сначала нужно прочитать
while(!feof(f3)){ // потом проверить конец файла.
    printf("%d", m);
    fread(&m, s, 1, f3);
}
Вы бы выделили чтение с конца в отдельную функцию, а то один и тот же код везде дублируется -- некрасиво.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2014, 14:48
Помогаю со студенческими работами здесь

Ввод и вывод в бинарных файлах
Где ошибка в коде? #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { ofstream f1; ...

Замена элементов в бинарных файлах
первая программа позволяет записать ФИО, группу, оценку и дату рождения 3-х студентов в файл TextSharaut.txt , вторая-считать с этого файла...

перетирание байтов с использованием seekp + write в бинарных файлах
Привет, возник вопрос с записью бинарных файлов. пишу в файл данные таким кодом : ofstream file1; ...

Для чего в бинарных файлах перевод на новую строку?
Добрый день! Прочитал, что бинарный файл отличается о текстового тем, что в первом нет символа возврата каретки \r. То есть, в...

Все числа, содержащиеся в двух бинарных файлах одновременно, переписать в третий файл
Создать два бинарных файла, все числа, содержащиеся в обоих файлах одновременно, переписать в третий файл. Дополнительных массивов не...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru