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

Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 - C++

Восстановить пароль Регистрация
 
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
07.05.2013, 09:05     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #1
Здравствуйте! У меня проблема: есть созданный бинарный файл и я не могу у него заменять определенный позиции на другие. Т.е. вот задание: создать бинарный файл, в него записать матрицу mxm. Пробежаться по всем диагональным элементам и все на место тех позиций, у которых значение меньше определенного числа, записать 0.
Вот мой код:
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstdlib>
#include <conio.h>
#include "fstream"
#include "iomanip"
 
using namespace std;
 
float CreateMass(int size) {
    fstream out ("MAT.FF", ios::out | ios::binary);
    double a;
        for (int i=0; i<size; i++) {
            for (int j=0; j<size; j++) {
                a=rand()%100;
                out << a << " ";}            
            out << endl;}
    out.close();
    return 0;
}
void print(int size){
    cout << endl << endl;
    double a;
    ifstream in ("MAT.FF", ios::in | ios::binary);
    in.seekg (1);
        for (int i=0; i<size; i++){
            for (int j=0; j<size; j++) {
                in >> a;
                cout << setw (5) << a;
            }
            cout << endl;
        }
    in.close();
}
void zamena(int size){
     float k;
     cout << endl <<"Vvedite k=";
     cin >> k;
     double a;
     ifstream in ("MAT.FF", ios::in | ios::binary);
     float *masDiag = new float[size];//вот массив с инфой о диагональных элементах
     float *mas = new float[size];
     for(int i = 0; i < size; i++)
             for(int j = 0; j<size; j++){
                     in >> a;
                     if(i==j){
                              if(a<k)
                                     masDiag[i]=1;                                     
                              else
                                     masDiag[i]=0;
                              mas[i] = a;                             
                     }                 
             }
     in.close();
     cout << endl;
     double g = 0;
     int count = 0;
     fstream file;
     file.open("MAT.FF",ios::app | ios::binary);  // вот в этом месте не работает, файл вроде открывает, но не записывает.  
     file.seekg (0, ios::beg);
     clout << endl << file.tellg();
             for(int i = 0; i < size; i++)
                     for(int j = 0; j<size; j++){
                             count++;
                             if(i==j && masDiag[i]==1)
                                     file.write ((char*)&g, sizeof(g));
                             else
                                     file.seekg (count, ios::beg);
                     }
     file.close();
}
 
int main() {
    int n;
    srand(time(NULL));
    cout<<endl<<"Vvedite razmernost massiva: ";
    cin>>n;
    float mass;
    mass=CreateMass(n);
    print(n);
    zamena(n);
    print(n);
    getch();
    return 0;
    
}
Программа реализована так: создается массив, в который записывается информация о каждом диагональном элементе(больше(1) или меньше(2) диагональный элемент, чем определенное значение). Потом открываем файл и смотрим эту инфу, если в массиве 1 , то на место диагонального элемента записываем 0 иначе просто не трогаем. Но не получается у меня заменить эти позиции. Логически, вроде, все правильно, но не работает. Помогите, пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 09:05     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0
Посмотрите здесь:

C++ Найти количество элементов массива, значение которых меньше 5
Составьте программу, которая выводит индексы тех элементов массива (состоящего из В целых чисел), значение которых больше заданного числа А C++
Записать в третий файл только те пары чисел, в которых число из первого файла меньше соответствующего числа из второго файла. C++
C++ Бинарные файлы. Вывести названия книг определенного автора, изданных до 2000 года. Определить долю книг
C++ Вычислить произведение элементов массива, значение которых меньше шести
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
07.05.2013, 10:11     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #2
mass=CreateMass(n);
Это глупость.
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
07.05.2013, 10:15  [ТС]     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #3
Цитата Сообщение от vua72 Посмотреть сообщение
Это глупость.
Да я согласен, говнокод. Но функция эта работает и выполняет свою роль, а конкретно по делу у вас есть мысли??
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
07.05.2013, 10:20     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #4
Если вы создаете бинарный файл, зачем вы его форматируете как обычный в CreateMas?

Добавлено через 1 минуту
Вы смешали два способа работы с файлами, определитесь какой вам нужен, тогда можно будет помочь
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
07.05.2013, 10:36  [ТС]     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #5
Он и форматируется как бинарный. fstream out ("MAT.FF", ios::out | ios::binary); вот же. Или я что-то не так понял?
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
07.05.2013, 10:47     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #6
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 <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstdlib>
#include "fstream"
#include "iomanip"
 
using namespace std;
 
void CreateMass(int size) {
    fstream out("MAT.FF", ios::out | ios::binary);
    double a;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            a = 100*rand()/(1.0*RAND_MAX);
            out.write((char*) &a, sizeof(a));
            cout << a <<" ";
        }
        cout <<endl;
    }
    out.close();
}
 
void print(int size) {
    cout << endl << endl;
    double a;
    ifstream in("MAT.FF", ios::in | ios::binary);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            in.read((char*)&a, sizeof(a));
            cout << a  << " ";
        }
        cout << endl;
    }
    in.close();
}
void zamena(int size) {
    float k;
    cout << endl << "Vvedite k=";
    cin >> k;
    double a, num=0.0;
    fstream in("MAT.FF", ios::in | ios::out| ios::binary);
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++) {
            in.read((char*)&a, sizeof(a));
            if (i == j && a < k) {
                in.seekg(-(sizeof(a)), in.cur);
                in.write((char*)&num, sizeof(a));
            }
        }
    in.close();
}
 
int main() {
    int n;
    srand(time(NULL));
    cout << endl << "Vvedite razmernost massiva: ";
    cin >> n;
    CreateMass(n);
    print(n);
    zamena(n);
    print(n);
    return 0;
 
}
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
07.05.2013, 11:03  [ТС]     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #7
vua72, спасибо, но функция с перезаписью все равно не работает. Просто файл не меняется
петр1984
Сообщений: n/a
07.05.2013, 11:07     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #8
подскажите почему незагружается доконца сканер вирусов выкидывает а после вообще незапускается

Добавлено через 42 секунды
на компе небыло антивирусника

Добавлено через 48 секунд
что можно сделать
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
07.05.2013, 12:07     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #9
Vvedite razmernost massiva: 3
13.0816 69.2141 94.1715
82.1885 4.1125 72.6129
97.069 49.6006 24.0197


13.0816 69.2141 94.1715
82.1885 4.1125 72.6129
97.069 49.6006 24.0197

Vvedite k=5


13.0816 69.2141 94.1715
82.1885 0 72.6129
97.069 49.6006 24.0197
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
07.05.2013, 13:15  [ТС]     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #10
А почему у меня не пашет?? Я вот, серьезно, ваш код запускаю.
Вот скрин:http://hostingkartinok.com/show-imag...92052aa3bab3e3
А у вас какая операционная система?? случаем не Linux?

Добавлено через 18 минут
В онлайн компиляторе тоже скомпилил - также ничего не меняется.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
08.05.2013, 00:57     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void zamena(int size) {
    double k = 0.0, a = 0.0, num = 0.0;
    cout << endl << "Vvedite k=";
    cin >> k;
    fstream fl("MAT.FF", ios_base::in | ios_base::out | ios_base::binary);
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++) {
            fl.read((char*) &a, sizeof(a));
            if ((i == j) && a < k) {
                fl.seekp(fl.tellp() - (streampos) sizeof(a));
                fl.write((char*) &num, sizeof(a));
            }
        }
    fl.close();
}
неправльно обрабатывается строка
C++
1
in.seekg(-(sizeof(a)), in.cur);
и в таком варианте тоже
C++
1
in.seekp(-(sizeof(a)), in.cur);
в 32 разрядной системе (ХР), почему, не понимаю.
После этой строки он ставит указатель позиции в -1 и все.
в 64 разрядной все работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2013, 15:07     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0
Еще ссылки по теме:

В последовательностях положительных чисел ограничить снизу значение тех элементов которые меньше среднего C++
C++ Количество элементов, значение которых меньше среднего арифметического в массиве
В матрице определить сумму положительных элементов и количество элементов, значение которых меньше числа Z C++

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

Или воспользуйтесь поиском по форуму:
fantom0005
0 / 0 / 0
Регистрация: 22.10.2012
Сообщений: 9
08.05.2013, 15:07  [ТС]     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0 #12
vua72, спасибо. Но у меня 64 разрядная. По-ходу очень плохо реализована библиотека fstream в плюсах.

Добавлено через 7 часов 19 минут
vua72, спасибо тебе большое за помощь. Я разобрался. Вот код, мож кому пригодиться.
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
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <cstdlib>
#include "fstream"
#include "iomanip"
 
using namespace std;
 
void CreateMass(int size) {
    fstream out("MAT.FF", ios::out | ios::binary);
    double a;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            a = 100*rand()/(1.0*RAND_MAX);
            out.write((char*) &a, sizeof(a));
            cout << a <<" ";
        }
        cout <<endl;
    }
    out.close();
}
 
void print(int size) {
    cout << endl << endl;
    double a;
    ifstream in("MAT.FF", ios::in | ios::binary);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            in.read((char*)&a, sizeof(a));
            cout << a  << " ";
        }
        cout << endl;
    }
    in.close();
}
void zamena(int size) {
    float k;
    cout << endl << "Vvedite k=";
    cin >> k;
    double a, num=0.0;
    int count = 1;
    fstream in("MAT.FF", ios::in | ios::out| ios::binary);
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++) {
            in.read((char*)&a, sizeof(a));
            if (i == j && a < k) {         
                int l = in.tellg();    
                l -=  sizeof(a);
                in.seekp(l, ios::beg);
                in.write((char*)&num, sizeof(a));
                l+=sizeof(a);
                in.seekg(l, ios::beg);
            }
            count ++;
        }
    in.close();
}
 
int main() {
    int n;
    srand(time(NULL));
    cout << endl << "Vvedite razmernost massiva: ";
    cin >> n;
    CreateMass(n);
    print(n);
    zamena(n);
    print(n);
    system("pause");
    return 0;
     
}
Yandex
Объявления
08.05.2013, 15:07     Бинарные файлы: на место тех позиций, у которых значение меньше определенного числа, записать 0
Ответ Создать тему
Опции темы

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