Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/56: Рейтинг темы: голосов - 56, средняя оценка - 4.91
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 55

Бинарный файл из вещественных чисел

14.05.2011, 12:09. Показов 10997. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан бинарный файл, содержащий вещественные числа (тип double). Перед каждой возрастающей последовательностью значений в файле вставить нулевое значение.

Пишу на Паскале, а Си конкретные проблемы. Вот то, что получилось

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
#include <stdio.h>  //Библиотека функций ввода и вывода
#include<locale.h> //Локализация
int main(int argc, char *argv[])
{
setlocale(LC_ALL,""); // Изменение текущей локали
 
  FILE *f = NULL;  //Объявление файловой переменной
  //Открытие файла для чтения и записи с проверкой
  if((f = fopen("1.txt","rb+")) == NULL){
    //Если файл открыть не удалось, то
    puts("Невозможно открыть файл!");//вывод сообщения
    return 0;                        //и выход
  }
  double val;  //Буфер для чтения данных
  //Чтение первого значения из файла
  if(fread(&val,sizeof(double),1,f) != 1){
    //Если файл пустой, то вывод сообщения и выход
    puts("Пустой файл!");
    return 0;
  }
  //Объявление и инициализация переменных
  double pred = val, nol=0.0; // pred - предыдущее значение
  long ind = 1;
  int fl = 0; // флаговая переменная
 
while(!feof(f)){  //Пока не конец файла
    //Чтение значения из файла
    fread(&val,sizeof(double),1,f);
 
// Если считанное значение больше предыдущего, то
    if(pred < val) {
   //  Если флаг 1, то переходим к следующему значению
    if  (fl==1) {ind++; continue;}
  // иначе записываем ноль на предыдущюю позицию
        else {
       fseek(f,(ind-1)*sizeof(double),SEEK_SET);
       fwrite(&nol,sizeof(double),1,f);
       ind++;
       fseek(f,2*sizeof(double),SEEK_CUR);
       ind++;
       fl=1; // устанавливаем флаг в 1
    }
     }
   else {ind++; fl=0;}  // устанавливаем флаг в 0 
}           
 fclose(f);  //Закрытие файла
  return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2011, 12:09
Ответы с готовыми решениями:

Бинарные файлы. Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне
Добрый день! Подскажите пожалуйста! Генерирую рандомное кол-во вещественных чисел, и записываю их в бинарный файл, после чего читаю...

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

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

9
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 12:32
Цитата Сообщение от Lenoriya Посмотреть сообщение
Пишу на Паскале, а Си конкретные проблемы.
А где найти эти конкретные проблемы? Еще желательно бы увидеть конкретные результаты конкретной трассировки.
0
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 55
14.05.2011, 12:56  [ТС]
Цитата Сообщение от Jtalk Посмотреть сообщение
А где найти эти конкретные проблемы?
Хотелось бы, чтобы знающий человек пересмотрел программку...
Я не уверена, что файл правильно считываю.
Установка нуля перед возрастающей последовательностью не получается.


Цитата Сообщение от Jtalk Посмотреть сообщение
Еще желательно бы увидеть конкретные результаты конкретной трассировки.
Подскажите, пожалуйста, как её сделать в Pelles C, тогда с удовольствием выложу.
0
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:03
Не совсем понятно использование fread для посимвольного считывания - для этого создан fscanf. Кроме того, у меня сильные подозрения, что он будет считывать строку вместе с пробелами.

А вот вывод с нулем на мой взгляд неверен - вывод в файл будет осуществляться поверх существующих данных, а не "между". То есть для добавления значения в середину файла нужно считать его весь до конца.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
14.05.2011, 13:36
Цитата Сообщение от Jtalk Посмотреть сообщение
Не совсем понятно использование fread для посимвольного считывания - для этого создан fscanf. Кроме того, у меня сильные подозрения, что он будет считывать строку вместе с пробелами.
Учите матчасть, `fread' - бинарное чтение, `fscanf' - форматное. У автора файл бинарный (так написано в задании). А значит и читать надо с помощью `fread'. То есть в файле должны быть не визуальное представление числа (0.5 0.6. 1.4), а битовая копия содержимого переменной типа double, человеческому глазу непонятная.
Это я все к тому, что не надо давать советов, если сами не знаете, о чем говорите

Нулями Вы переписываете содержимое старого файла. Необходимо сначала прочитать файл в массив целиком. А потом записывать, в нужных местах вставляя нули. Вот пример:
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
#include <stdio.h>
#include <malloc.h>
 
#define FILENAME "file.txt"
 
int main()
{
    FILE *pfile = NULL;
    size_t i = 0, file_size = 0;
    double *values = NULL, zero = 0.0;
 
    if ((pfile = fopen(FILENAME, "rb")) == NULL) {
        fprintf(stderr, "can't open file\n");
        return -1;
    }
 
    fseek(pfile, 0, SEEK_END);
    file_size = ftell(pfile);
    rewind(pfile);
 
    if ((values = (double *)malloc(file_size)) == NULL) {
        fprintf(stderr, "can't allocated memory\n");
        fclose(pfile);
        return -1;
    }
 
    fread(values, sizeof(double), file_size, pfile);
    fclose(pfile);
 
    if ((pfile = fopen(FILENAME, "wb")) == NULL) {
        fprintf(stderr, "can't open file for write\n");
        return -1;
    }
 
    for (i = 1; i < file_size / sizeof(double); ++i) {
        fwrite(values + i - 1, sizeof(double), 1, pfile);
        if (values[i-1] >= values[i])
            fwrite(&zero, sizeof(double), 1, pfile);
    }
 
    free(values);
    fclose(pfile);
    return 0;
}
1
95 / 81 / 3
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:41
Цитата Сообщение от fasked Посмотреть сообщение
У автора файл бинарный
Не обратил внимания. Тогда да, все нормально.
0
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 55
14.05.2011, 16:42  [ТС]
А как проверить работоспособность программы с бинарными вещественными числами?

И объясните, пожалуйста:

- что за size_t?
C
1
 size_t i = 0, file_size = 0;
- почему values + i - 1
C
1
 fwrite(values + i - 1, sizeof(double), 1, pfile);
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
14.05.2011, 17:00
Цитата Сообщение от Lenoriya Посмотреть сообщение
size_t
size_t это беззнаковое целое число.

Цитата Сообщение от Lenoriya Посмотреть сообщение
почему values + i - 1
цикл начинаем с единицы, минут один, чтобы не вылететь за границы массива... и кажется все таки да, мой косяк, последнее число возможно не записывается обратно
Цитата Сообщение от Lenoriya Посмотреть сообщение
А как проверить работоспособность программы с бинарными вещественными числами?
сделайте программу, которая будет читать файл и выводить на экран числа в форматном виде.
0
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 55
16.05.2011, 13:59  [ТС]
Идет проблема в считывании файла Возвращает нулевое значение.
Цитата Сообщение от fasked Посмотреть сообщение
C
1
fread(values, sizeof(double), file_size, pfile);
0
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 55
16.05.2011, 20:08  [ТС]
Разобралась))) Вроде работает правильно! Всем спасибо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.05.2011, 20:08
Помогаю со студенческими работами здесь

Создать файл, состоящий из п вещественных чисел. Найти сумму всех положительных чисел данного файла
:-[

Дан бинарный файл вещественных чисел
Дан бинарный файл вещественных чисел, содержащий коэффициенты квадратных уравнений (A1, B1, С1, A2, B2, С2, …). Создать новый...

Дан файл вещественных чисел Создать файл целых чисел, содержащий номера локальных максимумов исходного файла
2-File. Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов исходного файла в порядке...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта 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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru