Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
1

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

26.03.2015, 18:20. Показов 1346. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток всем участникам форума! При написании программы столкнулся с проблемой, которую самостоятельно, к сожалению, не могу решить. Поэтому скромно прошу помощи у знающих людей. Задача программы довольно проста: необходимо реализовать запись и чтение двумерного массива с использованием низкоуровневых функций. Создание файла и запись в файл проходят успешно. Также успешно считывается и размерность массива. Но затем при чтении самого массива происходит ошибка программы. Почему именно происходит ошибка я никак не могу понять. Буду очень признателен за помощь.
Собственно сам код программы:
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2015, 18:20
Ответы с готовыми решениями:

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

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

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

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

4
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,671
26.03.2015, 18:29 2
Лучший ответ Сообщение было отмечено Akrage как решение

Решение

Запись и чтение неправильно делаешь. Не получится разом записать содержимое, там же одни указатели. Надо в цикле это делать, как в 22-й строке, с количеством m * sizeof(int).
1
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
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,671
27.03.2015, 16:52 4
Вроде бы всё верно, только во втором цикле i < a.
Файл создаётся? Где именно ошибка?
1
5 / 5 / 4
Регистрация: 26.03.2015
Сообщений: 28
27.03.2015, 17:28  [ТС] 5
Цитата Сообщение от nmcf Посмотреть сообщение
Вроде бы всё верно, только во втором цикле i < a.
Ох, ну конечно же там i<a. Если бы не показали, так бы и не заметил.
Исправил, все отлично заработало. Ещё раз большое спасибо!
0
27.03.2015, 17:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2015, 17:28
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru