Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 498
от 18.08.2006, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 359, Экспертов: 58
В номере:Вопросов: 2, Ответов: 9


Вопрос № 51960: Здравствуйте уважаемые эксперты! У меня возник такой вопрос касательно работы с файлами: Существуют ли какие либо классы работы с файлами? Т.е. меня интересует что есть помимо стандартных fgets и т.д. Каким образом определить конец файла...
Вопрос № 51974: Здравствуйте. Очень нужна ваша помощь! Требуется конкретное указание как в MFC переделать стандартную реакцию на сообщение на свою. Т.е. по умолчанию клавиша Esc закрывает приложение. Я хочу перехватить сообщение и назначить свою реакцию....

Вопрос № 51.960
Здравствуйте уважаемые эксперты!

У меня возник такой вопрос касательно работы с файлами:
Существуют ли какие либо классы работы с файлами? Т.е. меня интересует что есть помимо стандартных fgets и т.д. Каким образом определить конец файла(для цикла) и как считывать файл построчно(а не в массив типа char на определенное количество элементов). Заранее благодарен за ответ...
Отправлен: 12.08.2006, 22:49
Вопрос задал: PollyRC (статус: 1-ый класс)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Zitz
Здравствуйте, PollyRC!

Собственно, накатал я класс ;) Т.е. отвечая на Ваш первый вопрос - существуют ;)
feof(file) - "определить конец файла".
Что касается того как считывать построчно, примерно так как реализовано в классе:
bool ReadString(char * str) - считывает строку в Ваш буфер "массив типа char на определенное количество элементов"
const char * ReadString() - считывает строку во внутренний буфер (ибо считать куда-то все равно нужно) "массив типа char на определенное количество элементов" и возвращает считанную строку, в данном случае Вам не нужно грузиться по поводу кол-ва элементов.

Ну а классы для работы с файлами существуют, мне например для текстовых файлов очень нравится класс CStdioFile из MFC (библиотека классов такая). Есть ли классы в стандартных библиотеках? Что-то не припомню...

А помимо fgetc с файлами можно работать через CreateFile (в Windows.h, если он у Вас есть) или через stream (см. приложение в конце).

Приложение:

---------
Успех неизбежен + Думать вообще полезно + Чем сейчас, тем лучше

Ответ отправил: Zitz (статус: Студент)
Ответ отправлен: 13.08.2006, 00:52

Отвечает: estiGi
Здравствуйте, PollyRC!
Ну прикольно, класс накатали... :)) Обвертка в обверке :-)
Просто хотелось бы добавить. CreateFile, так как и windows.h, собственно, быть не может, т.к. это и есть АПИ, и все остальные FILE* и stream'ы работают кажись через него (влом лезть в код проверять, но вроде других путей нету).
А вот эта фраза примечательная:
"Есть ли классы в стандартных библиотеках? Что-то не припомню..." :)
Классы ifstream, ostream, basic_stream'ы всякие - это и есть стандартная библиотека, что Вы и подстверждаете, написав следующеи строки:
#include "fstream"
#include "iostream"
using namespace std;
:)
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 13.08.2006, 07:09

Отвечает: gitter
Здравствуйте, PollyRC!
Если Вы работаете с MFC, то выбирете класс CStdioFile, иначе Вам лучше использовать классы сторонних разработчиков, или же, лучше всего, как мне кажется, написать свой класс, как это, например, предложил эксперт Zitz.

Удачи!
Ответ отправил: gitter (статус: Студент)
Ответ отправлен: 13.08.2006, 18:11

Отвечает: Хватов Сергей
Здравствуйте, PollyRC!

Конечно.
std::iostream - там их целое семейство.
Только они в отличие от библиотеки stdio с двоичными данными не работают.
Ответ отправил: Хватов Сергей (статус: 1-ый класс)
Ответ отправлен: 14.08.2006, 10:30

Отвечает: Santana
Здравствуйте, PollyRC!
Если файлец не большой, можно использовать TStringList. Очень удобно. методом LoadFromFile грузишь файл. методом SaveToFile сохраняешь. в свойстве Text все содержимое файла. а в коллекции Strings ... оно же ... только построчкам. и много других мелких радостей ...
Ответ отправил: Santana (статус: 5-ый класс)
Ответ отправлен: 14.08.2006, 10:48

Отвечает: Arct
Здравствуйте, PollyRC!

Конец файла - константа EOF
[code]
while(stream!=EOF)
{
}
[/code]
построчное считывание - функция getline( *buf,int num, char delim);
Возвращает строку в буфер( *buf) не более num символов, пока не встретит
символ delim, конец строки(' ') или конец файла(EOF)

читай учебник :)
Ответ отправил: Arct (статус: 1-ый класс)
Ответ отправлен: 17.08.2006, 10:06


Вопрос № 51.974
Здравствуйте.
Очень нужна ваша помощь!
Требуется конкретное указание как в MFC переделать стандартную реакцию на сообщение на свою.
Т.е. по умолчанию клавиша Esc закрывает приложение. Я хочу перехватить сообщение и назначить свою реакцию.
Заранее спасибо!
Отправлен: 13.08.2006, 01:11
Вопрос задал: MeX (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ross
Здравствуйте, MeX!

Откройте окно Class View и выберите класс, который будет перехватывать сообщение.
Откройте окно Properties и нажмите кнопку Messages.
В списке найдите сообщение WM_CHAR.
Щелкните справа от него и создайте обработчик (Add OnChar).
После этого будет создана функция OnChar в одном из параметров которой передается код клавиши.
Если он равен 27 или 0x1b значит была нажата клавиша Esc
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 13.08.2006, 01:51
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое!

Отвечает: estiGi
Здравствуйте, MeX!
Фигня, простите. Ненужно никаких WM_CHAR'ов. Да и не сработает. Создаем обработчик PreTranslateMessage и перехватываем там

BOOL CescDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
{
MessageBox ("Escape pressed");
return TRUE;
}

return CDialog::PreTranslateMessage(pMsg);
}

Можно перехватывать на более низком уровне - в WindowProc, но более геморройно
Ответ отправил: estiGi (статус: Студент)
Ответ отправлен: 13.08.2006, 06:58
Оценка за ответ: 5
Комментарий оценки:
:)
Хе, а вот такое кусок кода наиболее ценен.
Большое спасибо!
А то я уж измучился!

Отвечает: Mihasic
Здравствуйте, MeX!
Я так понял Вы про диалог говорите...
Самый простой способ, поставить в классе заглушку:

protected:
virtual void OnCancel() {}
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 14.08.2006, 09:55
Оценка за ответ: 3
Комментарий оценки:
Спасибо, но пробовал:НЕ работает!:(


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное