Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите, как работать с текстовыми файлами (отк 
:(
    Опции темы
DarkDS
Дата 3.8.2003, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: нет
Всего: 16



Цитата(mr @ 3.8.2003, 18:56)
Ладно, пусть будут "\n"; кстати, в Win добавляется еще и "\r" (в отличие от Линукса), если кто не верит - откройте Блокнот, нажмите Enter, сохраните, откройте любым HEX-вьювером. Что мы видим ? "0D 0A" ? Так это и есть "\n\r".

Да... В виндосе, как и в досе (откуда все пошло) перевод строки определяется 2-я символами - перевод строки и возрат каретки. Но при чтении С и многие другие языки заменяют это одним симоволом \n, а при записи преобразуют обратно в \n\r. Для 'совместимости' smile.gif
PM MAIL   Вверх
mr.DUDA
Дата 3.8.2003, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
А нельзя объяснить что за классы такие

Это MFC'шные классы для работы в архитектуре "документ/вид".

Понравилось ? Тогда продолжим smile.gif

"Вид" иногда называют "представлением" (англ. "view"). Эти классы - всего лишь соглашение, по которому две главные функции приложения (хранение данных, взаимодействие с юзером) делятся между классами, производными от CDocument и CView. Их объединяет класс, производный от CFrameWnd, который в свою очередь подключается из класса, производного от CWinApp с помощью т.н. шаблона документа (CSingleDocTemplate/CMultipleDocTemplate). Всего есть 2 разновидности приложений Document/View: SDI (один документ, одно окно) и MDI (много документов, много окон). Второй тип используется тогда, когда нужно юзать (открывать, закрывать) много доков одной прогой одновременно. Пример - Word в ранних версиях (потом MS вроде отошла от такой практики, но в реале множество окон Word2000 в taskbar'е - это все те же окна MDI). SDI используется когда нужен только один док.

Когда ты создаешь приложение MFC EXE (не окно диалога), у тебя генерится 4 основных класса плюс окно "About". Эти классы ты можешь изменять как тебе угодно, они будут определять структуру и функции именно твоей проги. В частности, документ предназначен для хранения данных, относящихся к сохраняемому/загружаемому файлу (и временных данных тоже) - значит, создай N переменных внутри класса CMyDoc и юзай их внутри дока (сохраняй, загружай в Serialize, очищай в OnNewDocument) и внутри "вида" (типа "CMyDoc *pDoc=GetDocument; pDoc->my_data = 1;"). Таким образом, документ - это класс, внутри которого хранятся все данные документа smile.gif
Отдельная песня - сериализация (Serialize), процесс сохранения и загрузки любых данных в двоичном виде. Для этого есть спец. класс CArchive, объект этого класса автоматом создается перед вызовом Serialize (когда ты выбрал "открыть" или "сохранить файл", MFC все сделает сама, создаст архив и преподнесет его тебе на блюдечке smile.gif ) - в него можно писать и читать операторами "<<" и ">>":
Код
class CMyDoc: public CDocument
{
      // ....  например, вот данные, хранимые в нашем документе:
      int          SomeInt;
      CString   MyString;
      // ...
};

// .....

void CMyDoc::Serialize(CArchive &ar)
{
   if(ar.IsStoring())
   {        
       ar<<SomeInt;
       ar<<MyString;
       // можно напрямую:  ar.Write(buf, len);
   }
   else
   {
       ar>>SomeInt;
       ar>>MyString;
       //  а можно и напрямую:  ar.Read(buf, len);
   }
}

Кроме того, этими операторами можно сохранять и загружать из архива объекты любых классов, производных от CObject, в том числе и объекты заранее неизвестных классов (делается так: "CObject *pOb=NULL; ar>>pOb;"). Тут есть свои тонкости, но сама возможность - просто рулеззз !!!

Объект "вид" - это прежде всего окно. В смысле, дочернее окно под CMainFrame (тулбар, меню и статусбар в "вид" не входят). Вид заточен под "отображение" данных документа (OnDraw), реакцию на любые оконные сообщения (мышка/клава/команды от тулбара и меню/таймер/проч.). Любое WinAPI'шное сообщение можно обработать, и в зависимости от твоей идеи, изменять данные документа (пример: нажал юзер кнопку с буквой -- ты вставил букву в pDoc->text).

Кроме того, если ты юзаешь MDI, у тебя будет не один, а несколько доков и видов; они "знают", кто чей smile.gif

Кроме того, в проекте можно создавать сколько угодно любых других окон, например диалогов; подключать их одно к другому, создавать и удалять когда это нужно. Когда ты создашь диалог в окне ресурсов, просто зайди в ClassWizard - и он тебя "обрадует" сообщением, что можно создать класс под новый диалог, все что от тебя потребуется чтобы вызвать диалог в проге - просто подключить файл с заголовком и написать "CMyDialog dlg; dlg.DoModal()".

Тут можно бы еще много чего написать, но это уже будет офф-топ, скажу только что MFC -- рульная библиотека, сочетающая поистине гигантские возможности для Win-программера с простотой и логичностью.


--------------------
user posted image
PM MAIL WWW   Вверх
DENNN
Дата 4.8.2003, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
что за классы такие
"CEditorDoc", "CEditorView" и др.

Классы, созданные визардом, наследуються от CDocument и CView соответственно.
PM ICQ   Вверх
mr.DUDA
Дата 4.8.2003, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Поправка к примеру на пред. странице:
Код

       DWORD len = ar.GetFile()->GetLength();
       char *buf = new char[len+1];
       ar.Read(buf, len);
       buf[len] = '\0';
       text = buf;
       delete buf;
 
      // теперь разбираемся с абзацами и удаляем "левые" переносы строк
       text.Replace("\r\n", "\n");            // делаем переносы как в Линуксе :)
       text.Replace("\n\n", "%%dbl");   // <---- два Enter'а подряд
       text.Replace("\n ", "%%beg");     // заменяем абзац на спец. символ
       text.Replace("\n\t", "%%beg");   // то же самое для др. вида абзаца
       text.Replace("\n", " ");  // <---- оставшиеся переносы заменяем пробелом
       text.Replace("%%beg", "\n      ");   // восстанавливаем абзацы
       text.Replace("%%dbl", "\n\n");    // <---- восстанавливаем двойные Enter'ы


DENNN, я ответил кратко (мот, и не совсем корректно), а в следующем абзаце дал практически ту же формулировку, что и ты. Не придирайся smile.gif

Это сообщение отредактировал(а) mr.DUDA - 4.8.2003, 11:06


--------------------
user posted image
PM MAIL WWW   Вверх
dmitryfly
Дата 4.8.2003, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 1.8.2003

Репутация: нет
Всего: нет




mr.DUDA, у меня вопрос, прости меня за назойливость....

Во время выполнения программы и чтения файла она не все "\n" и т.д. удаляет, чему я удивился, т.к. по идее и по смыслу программа должна работать идеально.........
Я не знаю, толи иногда в строке стоит иной символ, нежели "\n", толи прогамма работает некорректно на моей машине (в чём я честно говоря сомневаюсь).........

так вот вопрос: есть ли какая вакцина против зтого, или это всё-таки проблемма в WinМаздае?......

Благодарю всех за внимание........
PM MAIL   Вверх
mr.DUDA
Дата 4.8.2003, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



dmirtyfly, на этот раз все Ok (см. обновленную поправку выше)


--------------------
user posted image
PM MAIL WWW   Вверх
dmitryfly
Дата 4.8.2003, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 1.8.2003

Репутация: нет
Всего: нет



Да, спасибо Всем, особенно тебе, mr.DUDA, я просто раньше немного написал.....

Кстати, я, наряду с "\n" на " " заменял еще и "\r".... Зачем - не знаю, наверное интуиция, и все стало в лучшем виде.........


Еще раз ВСЕМ спасибо!!!!!!!
PM MAIL   Вверх
dmitryfly
Дата 4.8.2003, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 1.8.2003

Репутация: нет
Всего: нет



Вопрос: а как впихнуть прокрутку по вертикали, а то файлы он читае замечательно, а ничего кроме первой страницы прочитать не могу......wow.gif((((((((
PM MAIL   Вверх
mr.DUDA
Дата 5.8.2003, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



См. на предыдущей странице


--------------------
user posted image
PM MAIL WWW   Вверх
Step
Дата 5.8.2003, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



dmitryfly, каждый вопрос должен быть в отдельном топике


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.