Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871

проверить CFile

20.12.2012, 23:00. Показов 1967. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у меня VS 2008 русская профессиональная
прошу проверить вот такой тестовый код на других версиях
C++
1
2
3
4
5
6
7
8
CFileDialog dlg(TRUE);
if(dlg.DoModal()==IDOK)
{
CString str=dlg.GetPathName();
CFile fl(str,CFile::typeText);
 
 
}
все дело в том что у меня эта конструкция падает во время исполнения
при падении вышел на такой код
C++
1
ASSERT((nOpenFlags & typeText) == 0);   // text mode not supported
в файле filecore.cpp

в MFC вообще отказались от поддержки текстового режима CFile или только в моей версии?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2012, 23:00
Ответы с готовыми решениями:

CFile, чтение файла
Привет всем. Есть такой код: char *pBuff = new char; *pBuff = NULL; CFile...

Исходный код CFile из MFC
Подскажите, где можно найти исходные тексты этого класса?

Обработка файлов CFile & CArchive
ниже код записи строк в файл и чтения из него. предполагается что строк будет много. Нужно знать сколько их точно(строк) и в цикле их...

10
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 11:10
ValeryS, cуть проблемы вот в чём, в MSVS 2008 задачи выделения памяти, преобразования типов в основном возложены на программиста. Потому крах твоей программы происходил от того что под CFileDialog::m_ofn.lpstrFile не выделял память/либо не присваивал константной строковой переменной.
Посмотри этот проект, также как бонус обрати внимание на тело конструктора MFCOpenSaveDlg верней переменную OPENFILENAME и посмотри инициализацию её полей в BOOL CMFCOpenSaveDlg::OnInitDialog(),
как ты понял я подал ещё и код с диалогами открытия/сохранения в стиле API (причём будет тот же CFileDialog) мне как то GetOpen(Save)FileName больше нравятся, т.к можно не заморачваться на класс CFileDialog а просто передавать поля структуры в отдельные модули, причём одну и ту же структуру для обоих диалогов (очень функционально и компактно на мой взгляд)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
void CMFCOpenSaveDlg::OnOpenCfile() 
{
    // TODO: Add your control notification handler code here
    CFileDialog fDlg(true);//диалог выбора файла
    ////Вот самое главное в отличие от 6-ки надо выделить память///
    fDlg.m_ofn.lpstrFile = m_Path.GetBuffer(MAX_PATH);
    ///////////////////////////////////////////////////////////////
    fDlg.m_ofn.lpstrFilter="(*.*) Все файлы\0*.*\0";
    fDlg.m_ofn.lpstrTitle ="Выбор файла";
    if(fDlg.DoModal() == IDOK)
        m_Path = fDlg.m_ofn.lpstrFile;
    else
        m_Path = "Выбор файла отменён";
    UpdateData(false);
}
 
void CMFCOpenSaveDlg::OnSaveCfile() 
{
    // TODO: Add your control notification handler code here
    CFileDialog fDlg(false);//диалог сохранения файла
    ////Вот самое главное в отличие от 6-ки надо выделить память///
    fDlg.m_ofn.lpstrFile = m_Path.GetBuffer(MAX_PATH);
    ///////////////////////////////////////////////////////////////
    fDlg.m_ofn.lpstrFilter="(*.*) Все файлы\0*.*\0";
    fDlg.m_ofn.lpstrTitle ="Сохранение файла";
    if(fDlg.DoModal() == IDOK)
        m_Path = fDlg.m_ofn.lpstrFile;
    else
        m_Path = "Выбор файла отменён";
    UpdateData(false);
}
 
void CMFCOpenSaveDlg::OnOpenOfname() 
{
    // TODO: Add your control notification handler code here
    pFile.lpstrTitle= "Выбор файла";
    if(GetOpenFileName(&pFile))//Диалог выбора файла
        m_Path = pFile.lpstrFile;
    else
        m_Path = "Выбор файла отменён";
    UpdateData(false);
}
 
void CMFCOpenSaveDlg::OnSaveOfname() 
{
    // TODO: Add your control notification handler code here
    pFile.lpstrTitle= "Сохранение файла";
    if(GetSaveFileName(&pFile))//Диалог сохранения файла
        m_Path = pFile.lpstrFile;
    else
        m_Path = "Выбор файла отменён";
    UpdateData(false);
}
Миниатюры
проверить CFile  
Вложения
Тип файла: rar MFCOpenSave.exe.rar (6.3 Кб, 1 просмотров)
Тип файла: rar MFCOpenSave_proj.rar (23.9 Кб, 4 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 11:14
PS: ValeryS, это пашет только для Release
Цитата Сообщение от ValeryS Посмотреть сообщение
CFile fl(str,CFile::typeText);
в Debug тоже всплыл Exception
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 11:20
Доработай 1-ую функцю проекта
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void CMFCOpenSaveDlg::OnOpenCfile() 
{
    // TODO: Add your control notification handler code here
    CFile pFile;
    CString szFmt;
    CFileDialog fDlg(true);//диалог выбора файла
    ////Вот самое главное в отличие от 6-ки надо выделить память///
    fDlg.m_ofn.lpstrFile = m_Path.GetBuffer(MAX_PATH);
    ///////////////////////////////////////////////////////////////
    fDlg.m_ofn.lpstrFilter="(*.*) Все файлы\0*.*\0";
    fDlg.m_ofn.lpstrTitle ="Выбор файла";
    if(fDlg.DoModal() == IDOK)
    {
        pFile.Open(m_Path = fDlg.m_ofn.lpstrFile, CFile::typeText);
        szFmt.Format("File Length : %d bytes", pFile.GetLength());
        pFile.Close();
        AfxMessageBox(szFmt);
    }
    else
        m_Path = "Выбор файла отменён";
    UpdateData(false);
}
и посмотри Debug/Release (см скрины)
Миниатюры
проверить CFile   проверить CFile  
0
22.12.2012, 11:21

Не по теме:

В заключение :ИМХО CStdioFile на много лучше CFile...

0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.12.2012, 11:39  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS: ValeryS, это пашет только для Release
разумеется в Release ASSERT выбрасывается
но ведь зачем то он там стоит?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Потому крах твоей программы происходил от того что под CFileDialog::m_ofn.lpstrFile не выделял память/либо не присваивал константной строковой переменной.
нет здесь все в порядке
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
как ты понял я подал ещё и код с диалогами открытия/сохранения в стиле API
диалог я дал только для того чтобы не привязываться к конкретным файлам
если написать так
C++
1
2
3
4
5
6
CFileDialog dlg(TRUE);
if(dlg.DoModal()==IDOK)
{
CString str=dlg.GetPathName();
CFile fl(str);
 }
то все в порядке
проблема в CFile::typeText
началось все с того что я решил открыть текстовый файл в CFile,
не получилось, плюнул, сделал через fopen fread, но осадочек то остался
насколько я помню в шестерке это работало(правдо давно я с ней не работаю)
сейчас скачал 2012, поставил на виртуалку попробую с ней

Добавлено через 7 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
посмотри Debug/Release
я правильно понял, что шестерка тоже выбрасывает?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
:ИМХО CStdioFile на много лучше CFile...
не знаю не работал
я вообще CFile и прочее пытаюсь не использовать, посему в этом классе не силен
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 11:40
Цитата Сообщение от ValeryS Посмотреть сообщение
насколько я помню в шестерке это работало(правдо давно я с ней не работаю)
- нет в Debug она тоже светит исключение. Вобщем typeText как бы для Release, хмм страно, по моему там какого-то флага CFile не хватает, ща погляжу я вначале не придал этому значения
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.12.2012, 11:44  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вобщем typeText как бы для Release, хмм страно,
понимаешь он может просто игнорировать этот флаг
насколько я помню разница между текстовым и бинарным режимом в обработке 0x0D 0x0A в бинарном читает 2 байта в текстовом заменяет на один перевод строки (а ну еще ^Z конец файла)
посему логика может нарушится
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 11:45
ValeryS, http://msdn.microsoft.com/en-u... s.80).aspx
CFile::typeText Sets text mode with special processing for carriage return–linefeed pairs (used in derived classes only). CFile в автомате(как скажем i(o)fstream же стоит в текстовом режиме, на двоичный сбрасываем typeBinary а для текстового ничего не надо).
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
22.12.2012, 11:55  [ТС]
ща попробую открыть CFile c typeBinary и без (то же сделаю с CStdioFile)
и сравню буфера
о результатах сообщу дополнительно
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2012, 12:07
ValeryS, делай typeBinaryпри таком режиме перевод на новую строку буде \r\n т.е 2 символа вместо привычного \n
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2012, 12:07
Помогаю со студенческими работами здесь

CFile не читает уже открытый на запись файл
Есть вот-такой кусок кода: CFile file; file.Open(L"text.txt",CFile::modeRead); Все прекрасно открывается, но только до тех пор,...

Как открыть txt документ и считать в переменную string содержимое, используя CFile?
Добрый день! Подскажите пожалуйста! Как открыть txt документ и считать в переменную string содержимое, используя CFile?

Как проверить конец файла в CFile
Привет всем! Как в классе CFile или CStdioFile проверить конец файла?

Написать классы CFile и CMyDataFile
Создать класс CFile, инкапсулирующий в себе такие функции работы с файлами, как открытие, чтение, сохранение. На базе этого класса ...

MaskEdit: Как проверить на пустоту номер телефона, а также проверить ввод всех его цифр?
Туплю с утра... есть MaskEdit с маской !\(000\)000-0000;1;_ ..телефона. Как его проверить на пустоту, чтобы все цифры были введены? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru