1

Тема: Бінарні файли

Компонентами бінарного файлу F1 є цілі числа. Записати у новий бінарний файл F2 всі числа файлу F1 за винятком тих, які зустрічаються один раз. Порядок слідування чисел збігається.

#include <iostream>
#include <cmath>
using namespace std;

int** first_arr(int N) {
    srand(time(0));
    int** arr = new int* [N];
    for (int i = 0; i < N; i++)
        arr[i] = new int[N];
    cout << "Array: \n";
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            arr[i][j] =  1 + rand() % 10;
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }

    //cout << "\nArray after shell sort: \n";
    //for (int i = 0; i < N; i++) {
    //    for (int j = 0; j < N; j++)
    //        cout << arr[i][j] << " ";
    //    cout << endl;
    //}

    return arr;
}

int arr_in_f1(int N, int **arr) {
    FILE* f;

    fopen_s(&f, "F1.txt", "wt");
    if (!f) {
        cout << "Couldn`t open F1.txt" << endl;
        return 1;
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            fprintf(f, "%3d", arr[i][j]);
            //if ((i + 1) % 5 == 0)
            //    fprintf(f, "\n");
        }
        fprintf(f, "\n");
    }

    if (fclose(f) == EOF) {
        cout << "The file F1.txt was not closed" << endl;
    }
    cout << "Exit success" << endl;

    return 0;
}

int* mas_repeat(int N, int** arr) {
    srand(time(0));
    int m, n, index_i = {}, index_j = {};
    int** mas = new int* [N];
    for (int i = 0; i < N; i++)
        mas[i] = new int[N];
    cout << "Array where integers repeat : \n";

    int k = arr[0][0];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << m << endl;
            if (i != n || j != m) {
                if (arr[i][j] == k) {
                    if (m < N) {
                        m += 1;
                        k = arr[n][m];
                        i = 0;
                        j = -1;
                    } 
                    else {
                        n += 1;
                        if (n > N) break;
                        m = 0;
                        k = arr[n][m];
                        i = 0;
                        j = -1;
                    }
                }
                else {
                    if (i == N || j == N) {
                        index_i += n;
                        cout << index_i << endl;
                        index_j += m;
                        if (m < N) {
                            m += 1;
                            k = arr[n][m];
                            i = 0;
                            j = -1;
                        }
                        else {
                            n += 1;
                            if (n > N) break;
                            m = 0;
                            k = arr[n][m];
                            i = 0;
                            j = -1;
                        }
                    }
                }
            }
        }
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (i != index_i || j != index_j) {
                mas[i][j] = arr[i][j];
                cout << mas[i][j] << ' ';
            }
        }
        cout << endl;
    }

    return *mas;
    delete[]mas;
}

int cr_f2(int N, int** arr) {
    FILE* f;

    fopen_s(&f, "F2.txt", "wt");
    if (!f) {
        cout << "Couldn`t open F2.txt" << endl;
        return 1;
    }

    int *mas = mas_repeat(N, arr);
    for (int i = 0; i < N; i++) {
        fprintf(f, "%3d", mas[i]);
    }
    fprintf(f, "\n");

    if (fclose(f) == EOF) {
        cout << "The file F2.txt was not closed" << endl;
    }
    cout << "Exit success" << endl;

    return 0;
}

int main() {
    int N;
    cout << " N = ";
    cin >> N;
    int **arr = first_arr(N);
    arr_in_f1(N, arr);
    cr_f2(N, arr);
    delete[]arr;
}

Не можу ніяк доробити програму. Проблема зі змінними в середині циклу

2

Re: Бінарні файли

Компонентами бінарного файлу F1 є цілі числа. Записати у новий бінарний файл F2 всі числа ф

записати в структуру а її потім в файл

3

Re: Бінарні файли

srand(time(NULL)) слід викликати лише один раз за програму. Інакше можна отримати

srand(time(NULL));
int x = rand()%1000000;
srand(time(NULL));
int y = rand()%1000000;
if(x==y){ //імовірність цієї події близька до 100%
  cout<<"match!";
}

https://ideone.com/X8riJr

Стається це через те, що time повертає значення в секундах, і якщо два виклики srand стануться в межах однієї секунди, що цілком імовірно зі швидкостями сучасних комп'ютерів, то вони повернуть однакові значення, і ГПВЧ буде ініціалізовано одним значенням, тобто вся послідовність чисел, повернутих викликами rand() після такого srand, буде збігатися.

А нащо ви двовимірний масив робите? Спеціально собі життя погіршуєте? Робіть одновимірний і код буде значно простішим.
І взагалі в умові файл бінарний, а ви працюєте з текстовим.

Подякували: leofun011

4

Re: Бінарні файли

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

void write_file(std::vector<size_t> &, std::string);
void read_file(std::vector<size_t> &, std::string);
void print_vect(std::vector<size_t> &);
void del_meet_once(std::vector<size_t> &);

int main(int argc, char* argv[])
{
    std::vector<size_t> array_integer {777,65,11,12,33,445,5565,6564,11,231,777,65,656,757};
    std::string file_name_in = "file1.bin";
    std::string file_name_out = "file2.bin";
    write_file(array_integer, file_name_in);
  //
    array_integer.clear();
  read_file(array_integer, file_name_in);
    print_vect(array_integer);
    //
    del_meet_once(array_integer);
    print_vect(array_integer);
    return 0;
}

void del_meet_once(std::vector<size_t> & vect)
{
  size_t value = vect[0];
  bool is_exists = false;
  for(size_t i = 0; i < vect.size(); i++)
  {
    is_exists = false;
    for(size_t j = i + 1; j < vect.size(); j++)
    {
      if(vect[i] == vect[j])
      {
        is_exists = true;
        //std::cout << "i = " << i << " v= " << vect[i] << "\n";
      }

    }
    if(!is_exists)
    {
      vect.erase(vect.begin() + i);
      i--;
    }
  }

}

void print_vect(std::vector<size_t> & vect)
{
  std::cout << std::endl;
  for (size_t value : vect)
        std::cout << value << " ";
  std::cout << std::endl;
}

void read_file(std::vector<size_t> & vect, std::string file_name)
{
  std::ifstream in_file(file_name, std::ios::binary);
  size_t value;
  while(!in_file.eof())
  {
    in_file.read((char *)&value, sizeof(size_t));
    vect.push_back(value);
  }
  in_file.close();
}

void write_file(std::vector<size_t> & vect, std::string file_name)
{
  std::ofstream out_file(file_name, std::ios::binary);
  for (size_t value: vect)
  {
    out_file.write((char *)&value, sizeof(size_t));
  }
  out_file.close();
}
Подякували: leofun011

5

Re: Бінарні файли

Пане olmovc, яку саме частину слова "бінарний" ви не зрозуміли?

6

Re: Бінарні файли

я вас не зрозумів, можливо Ви код поверхнево прочитали. Бог суддя.

7

Re: Бінарні файли

olmovc написав:

я вас не зрозумів, можливо Ви код поверхнево прочитали. Бог суддя.

Дійсно. Вибачте мені, будь ласка, я був неуважний. Ваш код насправді працює з бінарними файлами.