Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2016, 15:11   #1
undertaker
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию Работа с файлами.

Всем привет!
У меня следующая проблема.
Пишу программу, работающую с внешним файлом, на С++.
Файл подгружается, данные считываются. И программа вылетает.
Если ниже добавить блок вывода данных массива на экран (по очереди выводящий все элементы) - программа доходит до своего логического завершения. Если под этим блоком еще что либо дописать - опять вылет. Ошибка самая обычная:
"Прекращена работа программы ....cpp.
Искать в интернете
Закрыть
Отладить"
Не могу понять что происходит, может кто что нибудь подсказать?

P.S. я же могу одновременно открывать разные файлы для чтения и записи? Вроде того:
Код:
ifstream ddrt("ddrt.txt");
ofstream ddrd("ddrd.txt");
Или перед работы с новым файлом надо закрывать старый?

Последний раз редактировалось undertaker; 27.10.2016 в 15:15.
undertaker вне форума Ответить с цитированием
Старый 27.10.2016, 15:21   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Так нажмите ж отладить и посмотрите, где и что падает. Что за код ошибки система пишет, если в сообщении подробности открыть?

Цитата:
Не могу понять что происходит, может кто что нибудь подсказать?
Будем телепатировать или код покажите?

Цитата:
я же могу одновременно открывать разные файлы для чтения и записи? Вроде того:
Можете
p51x вне форума Ответить с цитированием
Старый 27.10.2016, 15:31   #3
undertaker
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так нажмите ж отладить и посмотрите, где и что падает. Что за код ошибки система пишет, если в сообщении подробности открыть?
First-chance exception in Project1.exe: 0xC0000005: Access Violation.
Спамит такой строчкой.

сам код:
Код:
int main(int argc, char* argv[])
{
    SetConsoleCP (1251);
    SetConsoleOutputCP(1251);

    ifstream baza("baza.txt"); 
    ofstream otrezok("chast.txt"); /
    int rzmr;
    char *buff[50];
    cout << "Введите размер буфера: ";
    cin >> rzmr;
    int *mmr = new int[rzmr]; 
        for (int i = 0; i < rzmr; i++) 
        {
                baza >> *buff; 
                cout << *buff << endl; 
                mmr[i] = atoi(*buff);  
        }
        cout << endl;
        for (int i = 0; i < rzmr; i++)
        {
                otrezok << mmr[i]<<endl; 
        }
        otrezok.close();
        system("pause");
        return 0;
}
undertaker вне форума Ответить с цитированием
Старый 27.10.2016, 16:19   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Правильно спамит. Вы объявили массив под 50 указателей, а пытаетесь с ним работать как просто с массивом.

Кстати, память за собой надо удалять.
p51x вне форума Ответить с цитированием
Старый 27.10.2016, 18:24   #5
undertaker
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Правильно спамит. Вы объявили массив под 50 указателей, а пытаетесь с ним работать как просто с массивом.
Изменил код до такого вида:
Код:
int main(int argc, char* argv[])
{
    SetConsoleCP (1251);
    SetConsoleOutputCP(1251);
    ifstream baza("baza.txt"); 
    ofstream otrezok("chast.txt");
    int rzmr; 
    char *buff[50];
    cout << "Введите размер буфера: ";
    cin >> rzmr;
    int *mmr = new int[rzmr]; 
    for (int i = 0; i < rzmr; i++) 
    {
                baza >> *buff; 
                cout << *buff << endl;
                mmr[i] = atoi(*buff);  
                otrezok << mmr[i]<<endl;
    }
    cout << endl;
    baza.close();
    otrezok.close();
    delete [] mmr;
    system("pause");
    return 0;
}
Программа работает, ошибок нет. Но я не могу понять, собственно, я ведь ничего в части массива buff не поменял, почему перестала возникать ошибка?

Цитата:
Кстати, память за собой надо удалять.
Это да, вопрос в следующем - удалять и динамический массив и массив buff? А переменные? уточните пожалуйста, а то я не очень силен в этом.

p.s. Попытался вынести запись в файл в отдельный цикл - опять та же ошибка!
А вынесение в отдельный цикл необходимо, так как записывать в файл программа должна в упорядоченном виде.

p.p.s. удалил buff, реализовал запись из базы напрямую в mmr[i] - вроде работает без сбоев (осталось реализовать упорядочивание mmr).
Однако все равно буду рад получить ответы на выше заданные вопросы - для общего развития. Спасибо заранее!

Последний раз редактировалось undertaker; 27.10.2016 в 18:43.
undertaker вне форума Ответить с цитированием
Старый 27.10.2016, 20:43   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вы внимательно прочитали, что я написал?
Вы объявили массив указателей, вы не выделили память и не проинициализировали их.
Вы пытаетесь писать и читать по одному из них...
p51x вне форума Ответить с цитированием
Старый 27.10.2016, 23:45   #7
undertaker
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы внимательно прочитали, что я написал?
Вы объявили массив указателей, вы не выделили память и не проинициализировали их.
Вы пытаетесь писать и читать по одному из них...
Я почему то думал что это указатель на тип char длинной в 50 символов...
так же пытался сделать не 50 а 1 - все равно не вышло, а если убрать указатель то программа отказывается с ним работать.

Подскажите, пожалуйста, где есть информационная база хорошая, где были бы объяснены все эти моменты.
undertaker вне форума Ответить с цитированием
Старый 28.10.2016, 07:40   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

1. В С++ действует правило право-лево при чтении объявлений. См.
Код:
char* X[50];
X - это массив из 50 элементов типа указатель на char
2. Указатель имеет фиксированный размер. Где вы видели фразу указатель длинной 50?
3. Почему для одного указателя вы выделяете память, а для другого как будто не знаете что это такое.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа(очень простая) Структуры, работа с файлами yurda Фриланс 2 11.06.2016 08:44
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами sds614 Помощь студентам 0 14.03.2012 19:35
Работа с файлами VENOMIK Помощь студентам 1 17.02.2012 12:19