Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема со struct!

6.8K
27 декабря 2005 года
MacCybex
36 / / 27.12.2005
Привет!
При вызове функции появляется сообщение об ошибке
"Access violation at address".

Код:
struct sSettings
        {
        int intWidth;
        int intHeight;
        string chrSkin;
        } sMainSettings;
 
void ReadSettings(sSettings* p)
        {
        string strLine;
        char* chrLine;
        int intTest;
        ifstream inFile ("settings.txt");
        if(inFile.is_open())
                {
                inFile.seekg(0);
                inFile.getline(chrLine, 100);
                p->intHeight = StrToInt(chrLine);
                inFile.getline(chrLine, 100);
                p->intWidth = StrToInt(chrLine);
                inFile.getline(chrLine, 100);
                p->chrSkin=chrLine;
                inFile.close();
                }
        }


Вызов функции такой:

 
Код:
ReadSettings(&sMainSettings);


Подскажите, пожалуйста, в чем проблема.
443
27 декабря 2005 года
REmindER
292 / / 23.03.2003
Green конечно посоветует еще раз прочитать Страуструпа.
6.8K
27 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by REmindER
Green конечно посоветует еще раз прочитать Страуструпа.



Очень информативный ответ.

443
27 декабря 2005 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by MacCybex
Очень информативный ответ.


Спасибо. Наверное, надо так:

 
Код:
...
char chrLine[100];
...
6.8K
28 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by REmindER
Спасибо. Наверное, надо так:

 
Код:
...
char chrLine[100];
...



Спасибо REmindER!
Теперь все идет без ошибок.

3
28 декабря 2005 года
Green
4.8K / / 20.01.2000
Может, действительно, перечитать Страуструпа... ;)
Не знаю структуры файла, но лучше сделать так:
Код:
void ReadSettings(sSettings& settings)
{
    ifstream inFile("settings.txt");
    if( inFile.is_open() )
    {
        inFile >> settings.intHeight;
        inFile >> settings.intWidth;
        inFile >> settings.chrSkin;
        inFile.close();
    }
}

А ещё можно определить operator >> для структуры sSettings.
6.8K
28 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by Green
Может, действительно, перечитать Страуструпа... ;)
Не знаю структуры файла, но лучше сделать так:
Код:
void ReadSettings(sSettings& settings)
{
    ifstream inFile("settings.txt");
    if( inFile.is_open() )
    {
        inFile >> settings.intHeight;
        inFile >> settings.intWidth;
        inFile >> settings.chrSkin;
        inFile.close();
    }
}

А ещё можно определить operator >> для структуры sSettings.



Я пробовал считывать таким методом
inFile >> settings.chrSkin;, но текст считывается только до первого пробела. Поэтому и искал альтернативу. Правда использовал char*, а не char[]. Спасибо за идею.

3
28 декабря 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by MacCybex
Я пробовал считывать таким методом
inFile >> settings.chrSkin;, но текст считывается только до первого пробела. Поэтому и искал альтернативу. Правда использовал char*, а не char[]. Спасибо за идею.


Все равно, можно обойтись без C-style строк в программе на C++. Например, так:

 
Код:
getline(inFile, settings.chrSkin);
6.8K
28 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by Green
Все равно, можно обойтись без C-style строк в программе на C++. Например, так:
 
Код:
getline(inFile, settings.chrSkin);



Но тогда надо тип поменять в struct.
Со string на char[], а то в getline char* или char подавать надо.

3
28 декабря 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by MacCybex
Но тогда надо тип поменять в struct.
Со string на char[], а то в getline char* или char подавать надо.


Ничего менять не надо.
Смотри определение std::getline

Код:
template<class CharType, class Traits, class Allocator>
   basic_istream<CharType, Traits>& getline(
      basic_istream<CharType, Traits>& _Istr,
      basic_string<CharType, Traits, Allocator>& _Str
);

template<class CharType, class Traits, class Allocator>
   basic_istream<CharType, Traits>& getline(
      basic_istream<CharType, Traits>& _Istr,
      basic_string<CharType, Traits, Allocator>& _Str,
      CharType _Delim
);
6.8K
28 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by Green
Ничего менять не надо.
Смотри определение std::getline
Код:
template<class CharType, class Traits, class Allocator>
   basic_istream<CharType, Traits>& getline(
      basic_istream<CharType, Traits>& _Istr,
      basic_string<CharType, Traits, Allocator>& _Str
);

template<class CharType, class Traits, class Allocator>
   basic_istream<CharType, Traits>& getline(
      basic_istream<CharType, Traits>& _Istr,
      basic_string<CharType, Traits, Allocator>& _Str,
      CharType _Delim
);



У меня в C++ Builder 6 выдаёт такую ошибку:

 
Код:
[C++ Error] MainUnit.cpp(81): E2285 Could not find a match for 'istream::getline(string,int)'
3
28 декабря 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by MacCybex
У меня в C++ Builder 6 выдаёт такую ошибку:
 
Код:
[C++ Error] MainUnit.cpp(81): E2285 Could not find a match for 'istream::getline(string,int)'


Будь внимательнее, обрати внимание, что я говорю о функции std::getline, а ты о методе istream::getline.
Видимо ты пишешь
inFile.getline(settings.chrSkin);

а надо писать
getline(inFile, settings.chrSkin);

Там есть другая загвоздка... :)
Но о ней позднее, когда у тебя всё скомпилируется и запуститьститься.

259
28 декабря 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Вот читаю и думаю, а зачем этот вопрос в топике по CBuilder? Конечно stl никто не отменял, но если вопрос всетаки о Borland C++, то для сохранения и восстановления начальных значений существует специальный класс TIniFile. Да и чтение лучше делать функцией FileRead.
259
28 декабря 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by AlexandrVSmirno
Вот читаю и думаю, а зачем этот вопрос в топике по CBuilder? Конечно stl никто не отменял, но если вопрос всетаки о Borland C++, то для сохранения и восстановления начальных значений существует специальный класс TIniFile. Да и чтение лучше делать функцией FileRead.


Вот и примерчик:

Код:
__fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)

{
   TIniFile *ini;
   ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
   Top     =  ini->ReadInteger( "Form", "Top", 100 );
   Left    =  ini->ReadInteger( "Form", "Left", 100 );
   Caption =  ini->ReadString( "Form", "Caption",
                               "Default Caption" );
   ini->ReadBool( "Form", "InitMax", false ) ?
         WindowState = wsMaximized :
         WindowState = wsNormal;
   delete ini;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{
   TIniFile *ini;
   ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
   ini->WriteInteger( "Form", "Top", Top );
   ini->WriteInteger( "Form", "Left", Left );
   ini->WriteString ( "Form", "Caption", Caption );
   ini->WriteBool   ( "Form", "InitMax",
                       WindowState == wsMaximized );
   delete ini;
}

В фал будет записано:
[Form]
Top=185
Left=280
Caption=Default Caption
InitMax=0
6.8K
28 декабря 2005 года
MacCybex
36 / / 27.12.2005
Цитата:
Originally posted by Green
Будь внимательнее, обрати внимание, что я говорю о функции std::getline, а ты о методе istream::getline.
Видимо ты пишешь
inFile.getline(settings.chrSkin);

а надо писать
getline(inFile, settings.chrSkin);

Там есть другая загвоздка... :)
Но о ней позднее, когда у тебя всё скомпилируется и запуститьститься.



А этот вариант сохраняет текущую позицию в файле?
Или это и есть загвоздка :) ?

Цитата:
Originally posted by AlexandrVSmirno
Вот и примерчик:
Код:
__fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)

{
   TIniFile *ini;
   ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
   Top     =  ini->ReadInteger( "Form", "Top", 100 );
   Left    =  ini->ReadInteger( "Form", "Left", 100 );
   Caption =  ini->ReadString( "Form", "Caption",
                               "Default Caption" );
   ini->ReadBool( "Form", "InitMax", false ) ?
         WindowState = wsMaximized :
         WindowState = wsNormal;
   delete ini;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{
   TIniFile *ini;
   ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
   ini->WriteInteger( "Form", "Top", Top );
   ini->WriteInteger( "Form", "Left", Left );
   ini->WriteString ( "Form", "Caption", Caption );
   ini->WriteBool   ( "Form", "InitMax",
                       WindowState == wsMaximized );
   delete ini;
}

В фал будет записано:
[Form]
Top=185
Left=280
Caption=Default Caption
InitMax=0



Спасибо за инфу, но с текстовым файлом наверно быстрее будет работать.

А stl тут при чем?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог