Ошибка чтение/записи в защищенную область

Тема в разделе "MS Visual C++", создана пользователем mibin, 20 окт 2010.

  1. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Не много истории:
    В общем так...я написал программу которая создает файл и записывает туда структуру, копирнул это структуру в программу которая должна считывать этот файл и написал код для считывания(ниже приведу пример чтения и записи). Трасером я смог определить, что данные из файла считываются и считываются верно, но! после того как процедура считывания заканчивает свою работу и возвращается в процедуру которая вызвала ее возникает ошибка "чтения/записи в защищенную зону" и еще там было написано что это часто свидетельствует о поврежденной памяти (не думаю что такое возможно сразу на двух компах и то что память цела есть еще одно подтверждение, но об этом позже). Долго ли коротко ли, но мучения мои сегодня принесли первые плоды (я вставил код записи и чтения в процедуру обрабатывающую клик мышки и все заработало без ошибок), получив такой результат я был крайне удивлен, но позже меня удивило еще больше ТО! Что если код ЗАПИСИ и ЧТЕНИЕ из файла лежит в одной программе то все выполняется БЕЗ ОШИБОК даже если в последствии код записи удалить файл будет читаться и читаться без проблем! Но если файл создаю в одной программе, а читаю в другой то вылазиет эта дибильная ошибка.
    Вот код записи файла
    Код (C++):
    using namespace std;

    struct licfile {
    string name;
    float licnum;
    int sec;
    };


    int _tmain(int argc, _TCHAR* argv[])
    {
    licfile lic;
    float id;
    float num = 1679;
    cout << "Write name: "; cin >> lic.name; cout << endl;
    cout << "Write id: "; cin >> id; cout << endl;
    lic.licnum = id*num;
    cout << "Write sec(0 - unlim): "; cin >> lic.sec; cout << endl;
    FILE *file;
    file = fopen("lic.k", "wb");
    fwrite(&lic, sizeof(licfile), 1, file);
    fclose(file);
    return 0;
    }
    Вот код чтения:
    Код (C++):
    // ..........................................................................
    struct licfile
    {
    std::string name;
    float licnumber;
    int sec;
    };
    // ..........................................................................
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
    Int16 verify(int id, licfile *license) {
    FILE * file;
    licfile lic;
    file = fopen("lic.k", "rb");
    fseek(file, 0L, SEEK_SET);
    fread(&lic, sizeof(licfile), 1, file);
    fclose(file);
    return 1;
    }
    // ..........................................................................
    Это что ж такое получается...я могу прочитать только то что создал а все остальное нет? Помоему это как-то не правильно. Я допускаю что это как-то связано с платформой *.NET так как так прога которая записывает написана в обычной консольке, а которая считывает это уже графика с использованием 4ого Framework'a, может бы он как-то иначе файл обрабатывает файл из-за этого?

    Во вложении изображение вылезающей ошибки.
     

    Вложения:

    • error.JPG
      error.JPG
      Размер файла:
      66,9 КБ
      Просмотров:
      16
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Тут надо понимать 2 вещи:
    1. Записывая структуру в файл (или читая), ты используешь 1 сплошной кусок памяти, занимаемый твоей структурой.
    2. string - не лежит в памяти как один кусок. Посмотри чему равен sizeof(licfile), когда в нем лежит строка - думаю, будешь удивлен.
    string - это (грубо) всего лишь указатель на область памяти, где лежит твоя строка на самом деле. Почему у тебя работало? А неужели ты ни разу не заглянул в файл, что там записалось-то? А записался туда адрес памяти, где лежала строка. Когда ты этот адрес вычитал - если тебе повезло и строка все еще по этому адресу - то все работает.
     
Загрузка...

Поделиться этой страницей