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

  • Вопрос

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

    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;
    }
    Вот код чтения:
    // ..........................................................................
    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, может бы он как-то иначе файл обрабатывает файл из-за этого?

    20 октября 2010 г. 10:10

Ответы

  • Это не связано с .NET, т.к. если попробовать создать 2 c++ проекта и в одном записывать, а в другом читать - то получаем ту же самую ошибку. Ошибка связана с полем 'name' структуры licfile, а точнее с длинной значения этого поля. Видимо при чтении из файла длина строки определяется неверно и происходит ошибка.

    Как вариант вместо string можно использовать массив char с фиксированным размером - тогда все работает как надо.

    Или можно использовать динамический массив char - тогда посмотрите эту тему.


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 23 ноября 2010 г. 15:10
    8 ноября 2010 г. 8:59