Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Akrage
5 / 5 / 1
Регистрация: 26.03.2015
Сообщений: 28
#1

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

26.03.2015, 18:20. Просмотров 277. Ответов 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++):

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

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

Ошибка при чтении из файла - C++
Файл открывается, но читаться из него информация не хочется. Исходник int c_array :: save(char *path) { FILE *f; f =...

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

Ошибка при чтении бинарного файла - C++
почему у меня выводит два раза последнюю запись при чтении??(а файл записываю класс с 3 полями(номер,фамилия,код) #include &quot;stdafx.h&quot;...

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

4
nmcf
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
26.03.2015, 18:29 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Запись и чтение неправильно делаешь. Не получится разом записать содержимое, там же одни указатели. Надо в цикле это делать, как в 22-й строке, с количеством m * sizeof(int).
1
Akrage
5 / 5 / 1
Регистрация: 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
5754 / 5065 / 1733
Регистрация: 14.04.2014
Сообщений: 20,749
27.03.2015, 16:52 #4
Вроде бы всё верно, только во втором цикле i < a.
Файл создаётся? Где именно ошибка?
1
Akrage
5 / 5 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

Ошибка при чтении данных из файла - C++
Имеем такую функцию чтения даных из фаила: void chtenie(char *imafaila) { FILE *sklad= fopen(imafaila, &quot;r&quot;); if...

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

Не понятная ошибка при чтении из файла - C++
#include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;string&gt; #include&lt;fstream&gt; using namespace std; class Person { protected: int...

Ошибка при вызове метода класса, при чтении из файла - C++
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня вот такие данные a01 b10 А и Б надо запихнуть в...


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

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

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