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

проверить CFile

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

Author24 — интернет-сервис помощи студентам
у меня 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2012, 23:00
Ответы с готовыми решениями:

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

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

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

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

10
Заблокирован
Автор FAQ
22.12.2012, 11:10 2
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
22.12.2012, 11:14 3
PS: ValeryS, это пашет только для Release
Цитата Сообщение от ValeryS Посмотреть сообщение
CFile fl(str,CFile::typeText);
в Debug тоже всплыл Exception
0
Заблокирован
Автор FAQ
22.12.2012, 11:20 4
Доработай 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
  #5

Не по теме:

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

0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,699
22.12.2012, 11:39  [ТС] 6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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
22.12.2012, 11:40 7
Цитата Сообщение от ValeryS Посмотреть сообщение
насколько я помню в шестерке это работало(правдо давно я с ней не работаю)
- нет в Debug она тоже светит исключение. Вобщем typeText как бы для Release, хмм страно, по моему там какого-то флага CFile не хватает, ща погляжу я вначале не придал этому значения
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,699
22.12.2012, 11:44  [ТС] 8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вобщем typeText как бы для Release, хмм страно,
понимаешь он может просто игнорировать этот флаг
насколько я помню разница между текстовым и бинарным режимом в обработке 0x0D 0x0A в бинарном читает 2 байта в текстовом заменяет на один перевод строки (а ну еще ^Z конец файла)
посему логика может нарушится
0
Заблокирован
Автор FAQ
22.12.2012, 11:45 9
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
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,699
22.12.2012, 11:55  [ТС] 10
ща попробую открыть CFile c typeBinary и без (то же сделаю с CStdioFile)
и сравню буфера
о результатах сообщу дополнительно
0
Заблокирован
Автор FAQ
22.12.2012, 12:07 11
ValeryS, делай typeBinaryпри таком режиме перевод на новую строку буде \r\n т.е 2 символа вместо привычного \n
0
22.12.2012, 12:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2012, 12:07
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru