Бинарные файлы c++.
От: fantom0005  
Дата: 07.05.13 05:01
Оценка:
Здравствуйте! У меня проблема: есть созданный бинарный файл и я не могу у него заменять определенный позиции на другие. Т.е. вот задание: создать бинарный файл, в него записать матрицу mxm. Пробежаться по всем диагональным элементам и все на место тех позиций, у которых значение меньше определенного числа, записать 0.
Вот мой код:
#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);
     file << "asdsadas";
     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 иначе просто не трогаем. Но не получается у меня заменить эти позиции. Логически, вроде, все правильно, но не работает. Помогите, пожалуйста!
Re: Бинарные файлы c++.
От: jazzer Россия Skype: enerjazzer
Дата: 07.05.13 05:36
Оценка:
Здравствуйте, fantom0005, Вы писали:

F>Здравствуйте! У меня проблема: есть созданный бинарный файл и я не могу у него заменять определенный позиции на другие. Т.е. вот задание: создать бинарный файл, в него записать матрицу mxm. Пробежаться по всем диагональным элементам и все на место тех позиций, у которых значение меньше определенного числа, записать 0.

F>Вот мой код:
F>
F>     file.open("MAT.FF",ios::app | ios::binary);  // вот в этом месте не работает, файл вроде открывает, но не записывает.  

F>

зачем ios::app, если ты в середину файла собираешься писать?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Бинарные файлы c++.
От: peterbes Россия  
Дата: 07.05.13 06:35
Оценка:
Здравствуйте, fantom0005, Вы писали:


F>Программа реализована так: создается массив, в который записывается информация о каждом диагональном элементе(больше(1) или меньше(2) диагональный элемент, чем определенное значение). Потом открываем файл и смотрим эту инфу, если в массиве 1 , то на место диагонального элемента записываем 0 иначе просто не трогаем. Но не получается у меня заменить эти позиции. Логически, вроде, все правильно, но не работает. Помогите, пожалуйста!


Раз написал ios::binary, записывай бинарик, нет там никаких endl, endn и форматированного потока, а есть линейный массив данных, в хорошем случае данные имеют фиксированный размер.
У тебя бестолковое кручение холостых циклов и вообще дофига пустого неправильного кода, кода где должно быть 5 строчек, отсюда и не работает ничего
Всё что тебе надо, так получить адрес диагонального элемента произвольной строки, что-то вроде:


offset = (n+1)*i*sizeof(T) + sizeof(header);


где offset искомый адрес, T тип данных, n размерность матрицы, i — номер строки, sizeof(header) смещение к данным

дальше проход и чтение по всем диагональным элементам с заменой элемента по условию.
Генерация рандомной матрицы тоже моструёзна и неэффективна, можешь сгенерировать массив размерностью nxn и записать её разом, в случае больших данных генерируй и записывай блоками.
Re: Бинарные файлы c++.
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 07.05.13 09:22
Оценка:
Здравствуйте, fantom0005, Вы писали:

F>Программа реализована так: создается массив, в который записывается информация о каждом диагональном элементе(больше(1) или меньше(2) диагональный элемент, чем определенное значение). Потом открываем файл и смотрим эту инфу, если в массиве 1 , то на место диагонального элемента записываем 0 иначе просто не трогаем. Но не получается у меня заменить эти позиции. Логически, вроде, все правильно, но не работает. Помогите, пожалуйста!

Просто надо понять как матрица представляется программистами. А представляется она — вектором или массивом! Поэтому запись матрицы это запись обычного массива в файл. А работа с матрицей это работа с простым массивом в котором нужно просто правильно организовать доступ к элементам.
Sic luceat lux!
Re[2]: Бинарные файлы c++.
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 07.05.13 09:28
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, fantom0005, Вы писали:


F>>Программа реализована так: создается массив, в который записывается информация о каждом диагональном элементе(больше(1) или меньше(2) диагональный элемент, чем определенное значение). Потом открываем файл и смотрим эту инфу, если в массиве 1 , то на место диагонального элемента записываем 0 иначе просто не трогаем. Но не получается у меня заменить эти позиции. Логически, вроде, все правильно, но не работает. Помогите, пожалуйста!

K>Просто надо понять как матрица представляется программистами. А представляется она — вектором или массивом! Поэтому запись матрицы это запись обычного массива в файл. А работа с матрицей это работа с простым массивом в котором нужно просто правильно организовать доступ к элементам.
Массив конечно же одномерный.
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.