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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Lenoriya
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
14.05.2011, 12:09     Бинарный файл из вещественных чисел #1
Дан бинарный файл, содержащий вещественные числа (тип 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2011, 12:09     Бинарный файл из вещественных чисел
Посмотрите здесь:

C++ Дан файл вещественных чисел.
файл вещественных чисел, нужно поравить код совсем чуть-чуть C++
C++ Записать в файл последовательного доступа N вещественных чисел
Дан файл вещественных чисел, содержащий элементы нижнетреуголь- ной матрицы (по строкам) C++
C++ Найти количество вещественных чисел в файле и вывести их в другой файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 12:32     Бинарный файл из вещественных чисел #2
Цитата Сообщение от Lenoriya Посмотреть сообщение
Пишу на Паскале, а Си конкретные проблемы.
А где найти эти конкретные проблемы? Еще желательно бы увидеть конкретные результаты конкретной трассировки.
Lenoriya
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
14.05.2011, 12:56  [ТС]     Бинарный файл из вещественных чисел #3
Цитата Сообщение от Jtalk Посмотреть сообщение
А где найти эти конкретные проблемы?
Хотелось бы, чтобы знающий человек пересмотрел программку...
Я не уверена, что файл правильно считываю.
Установка нуля перед возрастающей последовательностью не получается.


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

А вот вывод с нулем на мой взгляд неверен - вывод в файл будет осуществляться поверх существующих данных, а не "между". То есть для добавления значения в середину файла нужно считать его весь до конца.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.05.2011, 13:36     Бинарный файл из вещественных чисел #5
Цитата Сообщение от 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;
}
Jtalk
93 / 79 / 4
Регистрация: 13.05.2011
Сообщений: 279
14.05.2011, 13:41     Бинарный файл из вещественных чисел #6
Цитата Сообщение от fasked Посмотреть сообщение
У автора файл бинарный
Не обратил внимания. Тогда да, все нормально.
Lenoriya
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
14.05.2011, 16:42  [ТС]     Бинарный файл из вещественных чисел #7
А как проверить работоспособность программы с бинарными вещественными числами?

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

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

Цитата Сообщение от Lenoriya Посмотреть сообщение
почему values + i - 1
цикл начинаем с единицы, минут один, чтобы не вылететь за границы массива... и кажется все таки да, мой косяк, последнее число возможно не записывается обратно
Цитата Сообщение от Lenoriya Посмотреть сообщение
А как проверить работоспособность программы с бинарными вещественными числами?
сделайте программу, которая будет читать файл и выводить на экран числа в форматном виде.
Lenoriya
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
16.05.2011, 13:59  [ТС]     Бинарный файл из вещественных чисел #9
Идет проблема в считывании файла Возвращает нулевое значение.
Цитата Сообщение от fasked Посмотреть сообщение
C
1
fread(values, sizeof(double), file_size, pfile);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2011, 20:08     Бинарный файл из вещественных чисел
Еще ссылки по теме:

Бинарные файлы. Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне C++
C++ Генератор случайных чисел для записи в бинарный файл
Работа с файлами (Дан файл, содержащий n вещественных чисел. .) C++

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

Или воспользуйтесь поиском по форуму:
Lenoriya
 Аватар для Lenoriya
0 / 0 / 0
Регистрация: 18.10.2010
Сообщений: 49
16.05.2011, 20:08  [ТС]     Бинарный файл из вещественных чисел #10
Разобралась))) Вроде работает правильно! Всем спасибо...
Yandex
Объявления
16.05.2011, 20:08     Бинарный файл из вещественных чисел
Ответ Создать тему
Опции темы

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