Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Jekyll-Hyde
0 / 0 / 0
Регистрация: 19.01.2018
Сообщений: 13
1

Двоичные файлы ввод-вывод, или как покороче

25.01.2018, 18:09. Просмотров 128. Ответов 0

Здравствуйте.
Введу в курс дела...
Уже как неделю я бьюсь над простейшим заданием по двоичным файлам ... Но вчера меня озарило. До меня наконец дошло, что я жуткий тугодум и мои умственные способности оставляют желать лучшего. Тем не менее, я это сделал.

В чем проблема? -->> Код получился аж в 128 строк ( Могут убить меня за такое)! По моему, это много больше, нежели надо.
Вопрос у меня такой: можно ли мой код, представленный ниже, как нибудь сократить(например, записывать и читать из двоичного файла целый массив, а не посимвольно ( я пробовал - у меня не получается)), но сделать это используя по максимуму лишь базовые функции и т.д.(т.е. то, что читабельно для таких чайников, каким я и являюсь) .

Для понимания того, о чем программа, само задание:
1. С помощью текстового редактора создать файл на диске, содержащий в первой строке два натуральных числа N и M – количество строк и столбцов матрицы соответственно, далее следует N строк, состоящих из M целых чисел – элементы матрицы. Числа в файле разделены пробелами.
2. Разработать, отладить, продемонстрировать и защитить преподавателю укрупненную графическую схему алгоритма и программу, которая создает двоичный файл на основе текстового файла, записывая в него сначала два целых числа N и M, а затем элементы матрицы, считанные из текстового файла. В качестве буфера при вводе-выводе использовать одномерный массив размерностью M. Вывести содержимое двоичного файла на монитор. Двумерные массивы не создавать.
3. Задачу разбить на подзадачи, решение которых оформить как функции.
4. Выполнить задание в соответствии с приведенными ниже вариантами. Учесть, что обрабатывать следует данные, хранящиеся в двоичном файле.

Вот сама программа
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#define _CRT_SECURE_NO_WARNINGS 
#include <iostream>
#include <fstream>
#include <clocale>
using namespace std;
 
int write_in_bin();
void output_matrix_and_find_string(ifstream &fbin, int *buf, int *k_buf, int k);
int find_sum(int *k_buf);
 
int n, m; // инициализация размера матрицы (нужны в несколькиз функциях)
int main()
{
    setlocale(LC_ALL, "Rus");
    if (write_in_bin() == 1) return 1;
    ifstream fbin("bfile.bin", ios::binary); // открытие созданного двоичного файла
    if (!fbin.is_open())
    {
        cout << "Ошибка! Невозможно открыть файл!";
        system("pause");
        return 0;
    }
    int *buf = new int[m]; // инициализация буфера
    int *k_buf = new int[m]; // инициализация буфера для k-той строки
    int k;
    cout << "Введите k: ";
    cin >> k;
    output_matrix_and_find_string(fbin, buf, k_buf, k);
    int result =  find_sum(k_buf);
    if (result == -1)
    {
        cout << "Подсчет невозможен, так как заданная строка не удовлетворяет условиям задания.";
        system("pause");
        return 0;
    }
    else
        cout << "Сумма элементов, расположенный между 1-м и 2-м отрицательными \n элементами " << k << " строки равна: " << result << endl;
    system("pause");
    return 0;
}
 
 
 
int write_in_bin()
{
    ifstream txt("tfile.txt");
    if (!txt.is_open())
    {
        cout << "Ошибка! Невозможно открыть файл!";
        system("pause");
        return 1;
    }
    ofstream bin("bfile.bin", ios::binary);
    txt >> n >> m;
    bin.write((char *)&n, sizeof(int));// запись в бинарный файл размер матрицы
    bin.write((char *)&m, sizeof(int));
    int *buf = new int[m];
    while (txt) // чтение из txt файла и запись матрицы в bin файл
    {
        for (int i = 0; i < m; i++)
        {
            txt >> buf[i];
        }
        for (int i = 0; i < m; i++)
        {
            bin.write((char *)&buf[i], sizeof(int));
        }
    }
    bin.close();
    txt.close();
    return 0;
}
 
void output_matrix_and_find_string(ifstream &fbin, int *buf, int *k_buf, int k) // здесь - вывод матрицы на экран, поиск k-той строки
{                                                                               // и запись её в буфер
    
    for (int i = 0; i < 2; i++) //чтение из bin файла размера матрицы и вывод их на экран
    {
        fbin.read((char *)&buf[0], sizeof(int));
        cout << buf[0] << " ";
    }
    cout << endl;
    int j = 0;
    while (j < n)
    {
        for (int i = 0; i < m; i++)
        {
            fbin.read((char*)&buf[i], sizeof(int));
        }
        for (int i = 0; i < m; i++)
        {
            cout << buf[i] << " ";
        }
        if (j == k - 1) // поиск k-той строки и запись её в буфер
            for(int i = 0; i < n; i++)
                k_buf[i] = buf[i];
        j++;
        cout << endl;
    }
}
int find_sum( int *k_buf)
{
    int neg1=-1, neg2=-1, sum = 0, i =0;
    while (i < n)  // поиск 1-го отрицательного числа
    {
        if (k_buf[i] < 0)
        {
            neg1 = i;
            i++;
            break;
        }
        i++;
    }
    if (i == n) return -1; // при его отсутствии вернуть значение -1
    while (i < n)
    {
        if (k_buf[i] < 0)
        {
            neg2 = i;
            break;
        }
        i++;
    }
    if (neg2 == -1) return -1; // при отсутствии 2-го отрицательного, вернуть -1
    for (int j = neg1 + 1; j < neg2; j++) // подсчет
        sum += k_buf[j];
    return sum;
}
А это пример содержимого файла tfile.txt
5 5
0 1 0 1 0
-1 3 2 -1 4
-1 2 5 9 7
1 2 3 4 -2
1 1 -2 2 -3

Заранее спасибо!!!

p.s. ...или все же нормально, не убьют?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2018, 18:09
Ответы с готовыми решениями:

Двоичные файлы, ввод-вывод
Здравствуйте. Столкнулся с проблемой ввода-вывода в двоичный файл. Вот само...

Двоичные файлы, ввод-вывод
Здравствуйте. При компиляции программы вызывается исключение со след. текстом: ...

Файловый ввод-вывод.Текстовые файлы
Добрый день! Создать текстовый файл, содержащий символьные значения,...

Вывод и ввод значений через файлы
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &quot;StdAfx.h&quot; using namespace...

Ввод вывод из/в файлы(и еще пару вопросов)
Знаю парочку способов ввести/вывести данные из файла не знаю какой из них...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2018, 18:09

Работа с файлами, ввод и вывод, многостроковые файлы
Есть проблема. Я пытался создать такую программу, смыслом которой является:...

Двоичные файлы
Здравствуйте. Кому не сложно, помогите, пожалуйста, решить задачу. Не забуду...

двоичные файлы
дан файл целых чисел. Создать два новых файла, первый из которых содержит...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru