Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Akrage
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
#1

Ошибка при чтении массива из файла - C++

26.03.2015, 18:20. Просмотров 302. Ответов 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <io.h>
#include <sys\stat.h>
#include <fcntl.h>
#include <time.h>
 
using namespace std;
 
// Прототипы 
int **new_mas(int n, int m);
int **delete_mas(int *[], int);
int random_mas(int **, int, int);
int write_mas(int **, int, int);
 
 
//Функции
int **new_mas(int n, int m)
{
    int **mas;
    mas = new int*[n];
    for (int i = 0; i < n; ++i)
        mas[i] = new int[m];
    return mas;
}
int **delete_mas(int *mas[], int n)
{
    for (int i = 0; i<n; i++)
    {
        delete[] mas[i];
        mas[i];
    }
    delete[] mas;
    mas = 0;
    return mas;
}
int random_mas(int **mas, int n, int m)
{
    int i, j;
    srand(time(NULL));
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            mas[i][j] = rand() % (10 - (-10) + 1) - 10;
    }
    return 1;
}
int write_mas(int **mas, int n, int m)
{
    int i, j;
    for (i = 0; i<n; i++)
    {
        for (j = 0; j<m; j++)
            cout << mas[i][j] << "\t";
        cout << endl;
    }
    return 1;
}
 
//Функция main()
void main()
{
    setlocale(0, "Russian");
 
    char fname[20];
    cout << "Введите имя файла\n";
    cin >> fname;
 
    int OurFile; // Объявление Handle (файлового дескриптора)
    int check_write = 0, check_read = 0;
//Меню выбора
    int k;
    begin:
    cout << "Выберете следующее действие:\n 1.Создать файл    2.Записать файл      3.Прочитать файл  \n";
    cin >> k;
    switch (k)
    {
//1. Создание файла
    case 1:
        OurFile = _creat(fname, S_IREAD | S_IWRITE);
        if (OurFile == -1)
        {
            cout << "***WARNING!!***\n Произошла ошибка при создании файла\n";
            exit(1);
        }
        else
            cout << "Файла успешно создан\n";
        goto begin;
        break;
        
//2. Запись в файл
     case 2:
        cout << "Введите размеры массива. Например таблица, состоящая из 4 строк и 3 столбцев - это массив размером 4х3, где 4 - количество строк, а 3-количество столбцев\n";
 
        int n, m;
        cin >> n >> m;
 
        int **mas;
        mas = new_mas(n, m);
        random_mas(mas, n, m);
        write_mas(mas, n, m);
 
        OurFile = _open(fname, O_WRONLY);
        _setmode(OurFile, O_BINARY);
        if (OurFile == -1)
            cout << "***WARNING!!!***\nОшибка при открытии файла\n";
        else
            cout << "Файл успешно открыт\n";
        check_write = _write(OurFile, &n, sizeof(n));
        check_write = _write(OurFile, &m, sizeof(m));
        check_write=_write(OurFile, mas, sizeof(mas));
        if (check_write == -1)
            cout << "**WARNING!!!***\n Ошибка при записи в файл\n";
        else
            cout << "Данные в файл были успешно записаны\n";
        
        _close(OurFile);
        cout << sizeof(mas);
        delete_mas(mas, n);
        break;
        
//3.Чтение из файла
    case 3:
 
        OurFile = _open(fname, O_RDONLY);
        _setmode(OurFile, O_BINARY);
        if (OurFile == -1)
            cout << "***WARNING!!!***\nОшибка при открытии файла\n";
        else
            cout << "Файл успешно открыт\n";
        int **mas2;
        int a, b;
    
        check_read = _read(OurFile, &a, sizeof(a));
        check_read = _read(OurFile, &b, sizeof(b));
        mas2 = new_mas(a, b);
 
        check_read = _read(OurFile, mas2,sizeof(mas2));
        if (check_read == -1)
            cout << "**WARNING!!!***\n Ошибка при чтении файла\n";
        else
            write_mas(mas2, a, b);
 
        _close(OurFile);
        delete_mas(mas2, a);
    
        break;
    }
    
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2015, 18:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при чтении массива из файла (C++):

Ошибка при бинарном чтении массива структур из файла
Здравствуйте! Написал программу, которая бинарно записывает и считывает массив...

Ошибка при чтении из файла
Помогите разобраться с чтением из файла. Листинг указан ниже. Программа...

Ошибка при чтении из файла
Файл открывается, но читаться из него информация не хочется. Исходник int...

Ошибка при чтении файла
Необработанное исключение по адресу 0x0FE4172C (msvcp140d.dll) в .exe:...

Ошибка при чтении файла
Есть вот такой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Ошибка при побайтовом чтении файла
Не могу понять: есть файл, в нем лежат байты: FF 55 11 22 33 44 когда я...

4
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,382
26.03.2015, 18:29 #2
Лучший ответ Сообщение было отмечено Akrage как решение

Решение

Запись и чтение неправильно делаешь. Не получится разом записать содержимое, там же одни указатели. Надо в цикле это делать, как в 22-й строке, с количеством m * sizeof(int).
1
Akrage
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
27.03.2015, 15:25  [ТС] #3
nmcf, спасибо большое за ответ. Завтра переделаю вашим способом. Просто нам преподаватель сказал, что для структур лучше использоваться высокоуровневые функции, а для массивов - низкоуровневые. Поэтому я почему-то решил, что можно по аналогии с
C++
1
2
fwrite(toy, sizeof(TOY), n, F);
fread(toy, sizeof(TOY), n, F);
тоже самое проделать и с массивами. Но оказалось, я глупо ошибся.

Добавлено через 20 часов 42 минуты
Надо в цикле это делать, как в 22-й строке, с количеством m * sizeof(int).
Попробовал сделать. Но снова не работает. Похоже вновь ошибся, неправильно поняв ваши слова
C++
1
2
for (int i = 0; i < n; i++)
        check_write = _write(OurFile, mas[i], m*sizeof(int));
C++
1
2
for (int i = 0; i < n; i++)
            check_read = _read(OurFile, mas2[i], b*sizeof(int));
0
nmcf
6247 / 5559 / 2529
Регистрация: 14.04.2014
Сообщений: 23,382
27.03.2015, 16:52 #4
Вроде бы всё верно, только во втором цикле i < a.
Файл создаётся? Где именно ошибка?
1
Akrage
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
27.03.2015, 17:28  [ТС] #5
Цитата Сообщение от nmcf Посмотреть сообщение
Вроде бы всё верно, только во втором цикле i < a.
Ох, ну конечно же там i<a. Если бы не показали, так бы и не заметил.
Исправил, все отлично заработало. Ещё раз большое спасибо!
0
27.03.2015, 17:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2015, 17:28
Привет! Вот еще темы с решениями:

Не понятная ошибка при чтении из файла
#include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;string&gt; #include&lt;fstream&gt;...

Ошибка при чтении бинарного файла
почему у меня выводит два раза последнюю запись при чтении??(а файл записываю...

Ошибка при чтении из текстового файла
Имеется следующий код: FILE* b = fopen(&quot;baza.txt&quot;, &quot;r&quot;); char line; ...

Ошибка при чтении данных из файла
Имеем такую функцию чтения даных из фаила: void chtenie(char *imafaila) { ...


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

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

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