Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
#1

Чтение из файла - C++

14.07.2013, 23:33. Просмотров 905. Ответов 10
Метки нет (Все метки)

Добрый день. Есть следующая программа. Она вначале записывает массив объектов в файл, а затем должна считать его. Когда я применяю полный код программы, все работает как надо. Но когда удаляю область, которая записывает данные в файл (т.е. оставляю только ту часть программы, которая считывает информацию), мне выдает следующую ошибку: Unhandled exception at 0x00BEBB19 in flAlpha.exe: Stack cookie instrumentation code detected a stack-based buffer overrun. В чем может быть проблема?

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
#include <iostream>
#include <fstream>
#include <Windows.h>
 
using namespace std;
 
class Library
{
private:
    char title[128];
public:
    void getFilm();
    void showFilm();
};
 
void Library::getFilm()
{
    cout << "Введите название: ";
    cin.getline(title, 128);
}
 
void Library::showFilm()
{
    cout << "Название: " << title << endl;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Library films[3];
    ofstream out("lb.txt", ios::binary); // комментирую начиная отсюда
    if (!out)
    {
        cout << "Не могу открыть файл. " << endl;
        system("pause");
        return 1;
    }
    for (int i = 0; i < 3; i++)
    {
        films[i].getFilm();
        out.write((char*) &films[i], sizeof films);
    }
    out.close(); 
    system("cls"); // и заканчивая тут. без комментирования все работает.
    ifstream in("lb.txt", ios::binary);
    if (!in)
    {
        cout << "Не могу открыть файл. " << endl;
        system("pause");
        return 1;
    }
    for (int i = 0; i < 3; i++)
    {
        in.read((char *) &films[i], sizeof films);
        films[i].showFilm();
    }
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 23:33     Чтение из файла
Посмотрите здесь:

чтение файла - C++
в книге ifstream aa; aa.open(............); нам объясняли: ifstream open(''lala.txt,ios::....); точно не помню

Чтение файла - C++
Знаю, что очень ламерский вопрос... Вот только нихрена не получается! Я и так и сяк вертел... Вобщем, есть файл .txt с записями вида ...

чтение файла - C++
Как реализовать след.: считывать файл до определённого символа?

Чтение из файла - C++
Здравствуйте. Хочу, чтобы программа читала значения переменных из файла input.txt: Please choose the crystal lattice. Type 1 for BCC, 2...

Чтение файла - C++
Добрый день, вопрос, конечно, повторяющийся и от поиска лопата сломалась, но 2 день не могу такое элементарное сделать, а именно:...

Чтение из файла - C++
Необходимо считать последовательность чисел из файла в массив. Есть функция которая это реализует. На вход ей подается имя файла и еще один...

Чтение из файла - C++
Подскажите как вывести на экран содержимое файла на Си, если данные разделены &quot;;&quot;. Файл имеет вид: 1;23233233;1234-43;иванов...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
14.07.2013, 23:41     Чтение из файла #2
у меня всё работает MSVS2008 debug
только кодировку пришлось выставить через setlocale(LC_ALL, "rus"), а не через SetConsoleOutputCP почему-то.
Но это явно не связано с критическими ошибками.
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
14.07.2013, 23:51  [ТС]     Чтение из файла #3
Программу писал в 2013 версии, на компе также установлена 2010. В ней выдает следующую ошибку:

A buffer overrun has occurred in test.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program.

For more details please see Help topic 'How to debug Buffer Overrun Issues'.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
15.07.2013, 00:01     Чтение из файла #4
Цитата Сообщение от dima55501 Посмотреть сообщение
out.write((char*) &films[i], sizeof films);
Может стоит писать sizeof(films[i]) либо sizeof(Library)?
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
15.07.2013, 00:19  [ТС]     Чтение из файла #5
Опа
Написал out.write((char*) &films[i], sizeof Library) и все заработало. Если не сложно, объясни, пожалуйста, про второй аргумент функции write. В книге читал, но так до конца и не понял.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
15.07.2013, 00:27     Чтение из файла #6
А что непонятного? Первый аргумент - указатель на начало блока данных. Второй аргумент - размер, т.е. служит для определения конца записываемого блока.
В твоеё программе размер блока равен размеру всего массива. Таким образом, весь массив записывается в файл уже на первой итерации цикла.
А дальше идёт попытка обратиться к памяти, которая выходит за границы массива.

Кстати, это означает, что и от цикла можно вообще-то отказаться. а просто вызвать fwrite для всего массива целиком
C++
1
out.write((char*) &films[i], sizeof films);
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
15.07.2013, 00:36  [ТС]     Чтение из файла #7
В общем я так и не понял, почему получилось с sizeof Library, но не работало с sizeof films.
Но в любом случае большое спасибо за помощь.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.07.2013, 13:22     Чтение из файла #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
у меня всё работает MSVS2008 debug
В 10 студии исключение: нарушение прав доступа при чтении.
Цитата Сообщение от dima55501 Посмотреть сообщение
В общем я так и не понял, почему получилось с sizeof Library, но не работало с sizeof films.
Потому что sizeof films равен 384 байтам, а sizeof Library - 128.
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
15.07.2013, 18:20  [ТС]     Чтение из файла #9
Цитата Сообщение от alsav22 Посмотреть сообщение
В 10 студии исключение: нарушение прав доступа при чтении.
Потому что sizeof films равен 384 байтам, а sizeof Library - 128.
Хорошо, тогда как определить, в каком случае размер чего использовать?
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
15.07.2013, 18:37     Чтение из файла #10
Цитата Сообщение от dima55501 Посмотреть сообщение
в каком случае размер чего использовать?
Никаких случаев нет. Просто размер, указываемый в write должен соответствовать тому, что ты пытаешься записать.
Хочешь записать один экземпляр книги - указывай sizeof(Library)
потому что sizeof(films) это размер всего массива из трёх книг и если его указать, будет попытка записать нечто в 3 раза большее, чем ты ожидал записать. (ты же хотел записать 3 раза по одной книге!, а получилось 3 раза по целой библиотеке. Причём во второй и третий раз цикл вышел за её пределы, т.к. вся библиотека уже записалась на первом проходе цикла)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2013, 19:24     Чтение из файла
Еще ссылки по теме:

Чтение из файла - C++
FILE *fp; char gf, a1, a2, a3; int a, i, j, k; fp = fopen (&quot;database.txt&quot;, &quot;r&quot;); do { fscanf (fp, &quot;% %* % %* %s&quot;, a1,...

Чтение из файла на C - C++
Имеется текстовый файл, в нём заданы числа (примерно такого вида: 40 30 66 1 132 и т.д.), числа можно записать и построчно (в каждой строке...

Чтение из файла - C++
Такое дело: В одном методе создаётся экземпляр ifstream, открывается,читает и закрывается. Позже: в другом классе и методе создаётся...

Чтение из файла - C++
Добрый вечер! Помогите пожалуйста с одной проблемкой! Я Создала структуру node Вот он: struct node { char sym; float pro; ...

Чтение с файла - C++
Добрый день. Подскажите пожалуйсто. В файле .dat маходятся по три числа в строке(445.345 43.54 345.34) их разделяют пробелы. Как мне...


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

Или воспользуйтесь поиском по форуму:
dima55501
29 / 33 / 6
Регистрация: 14.07.2013
Сообщений: 146
15.07.2013, 19:24  [ТС]     Чтение из файла #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Никаких случаев нет. Просто размер, указываемый в write должен соответствовать тому, что ты пытаешься записать.
Хочешь записать один экземпляр книги - указывай sizeof(Library)
потому что sizeof(films) это размер всего массива из трёх книг и если его указать, будет попытка записать нечто в 3 раза большее, чем ты ожидал записать. (ты же хотел записать 3 раза по одной книге!, а получилось 3 раза по целой библиотеке. Причём во второй и третий раз цикл вышел за её пределы, т.к. вся библиотека уже записалась на первом проходе цикла)
Спасибо, вроде понял
Yandex
Объявления
15.07.2013, 19:24     Чтение из файла
Ответ Создать тему
Опции темы

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