Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2010, 18:36   #1
alexei-evil
 
Регистрация: 12.04.2010
Сообщений: 7
По умолчанию Чтение и запись в файл. C++ MFC.

Здравствуйте! Только начал изучать MFC, поэтому задаю глупые вопросы.
Передо мной такая задача: мне нужно организовать получение данных из файла, который выберет пользователь в диалоге. Содержимое файла выглядит примерно так:
1 2 3
4 5 6
7 8 9
и т.д.
файл .txt
То есть в каждой строке имеется три числа разделенные пробелами. Нужно сделать так, чтобы каждое число в строке сохранялось в отдельную переменную X,Y и K.
Например: первая строка X=1,Y=2,K=3, далее вторая строка X=4,Y=5, K=6и так далее, пока не закончится файл. Перерыв достаточно большое количество литературы, я в итоге остановился на таком варианте организации диалога выбора файла:

#include <afxwin.h>
#include <afxdlgs.h>
#include <iostream.h>
#include <cstdlib>
#include <fstream>
#include <stdio.h>

using namespace std;

void main( void )
{
if ( !AfxWinInit( ::GetModuleHandle( NULL ), NULL, ::GetCommandLine( ), 0 ) )
{
cerr << _T( "MFC Failed to initialize.\n" );
}

CString m_Text;

// создание стандартной панели выбора файла Open
CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL,
OFN_HIDEREADONLY,(LPCSTR)" Text Files (*.txt) |*.txt||");

// отображение стандартной панели выбора файла Open
if(DlgOpen.DoModal()==IDOK)
{
// создание объекта и открытие файла для чтения
CStdioFile File(DlgOpen.GetPathName(),CFile::m odeRead|CFile::typeBinary);

// чтение из файла строки
CString& ref=m_Text;
File.ReadString(ref); // передается ссылка на строку m_Text
cout << "Load string = " << m_Text << endl;
}
}

Однако данный пример читает, только строку целеком, а мне нужно, выделить из этой строки числа стоящие между пробелами.
Использовать методы класса CString: Left\Mid\Right не реально, потому что числа генеряться случайно и могут быть любой длины от 0 до 1000.

В консольном варианте я это организовал так:

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int main()
{
int x,y,c;
char* fileName = new char[10];
char* buf_x = new char [50];
char* buf_y = new char [50];
char* buf_c = new char [50];
{
ifstream* inp = new ifstream("result.txt");
while (!inp->eof())
{
inp->getline(buf_x, 50, ' ');
inp->getline(buf_y, 50, ' ');
inp->getline(buf_c, 50, ' ');
x=atoi(buf_x);
y=atoi(buf_y);
c=atoi(buf_c);
cout << x << " " << y << " " << c;
cout << "\n";
}
}
system("PAUSE");
return 0;

}

Но как это использовать в MFC ума не приложу.
Вобщем, посоветуйте пожалуйста, как мне решить данную проблему?
Заранее благодарен!

P.S. Если я описал задачу не достаточнго понятно, задавайте пожалуйста уточняющие вопросы, постараюсь ответить как можно быстрее.
alexei-evil вне форума Ответить с цитированием
Старый 19.07.2010, 18:50   #2
alexei-evil
 
Регистрация: 12.04.2010
Сообщений: 7
По умолчанию

Еще мне в голову приходил вариант сохранять считанные строки в другой файл, путь к которому мне заранее известен, чтобы можно было потом воспользоваться тем способом, который я сделал для консольного приложения.
Соответственно я кое что добавил:

#include <afxwin.h>
#include <afxdlgs.h>
#include <iostream.h>
#include <cstdlib>
#include <fstream>
#include <stdio.h>

using namespace std;

void main( void )
{
if ( !AfxWinInit( ::GetModuleHandle( NULL ), NULL, ::GetCommandLine( ), 0 ) )
{
cerr << _T( "MFC Failed to initialize.\n" );
}
CString m_Text;
// создание стандартной панели выбора файла Open
CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL,
OFN_HIDEREADONLY,(LPCSTR)" Text Files (*.txt) |*.txt||");

// отображение стандартной панели выбора файла Open
if(DlgOpen.DoModal()==IDOK)
{
// создание объекта и открытие файла для чтения
CStdioFile File(DlgOpen.GetPathName(),CFile::m odeRead|CFile::typeBinary);
// чтение из файла строки
for(int i=0;i<100;i++)

CString& ref=m_Text;
File.ReadString(ref); // передается ссылка на строку m_Text
// ============ ТО, ЧТО ДОБАВИЛ ===================
CStdioFile File("c:\\temp\\temp.txt",CFile::mo deCreate|CFile::modeWrite|CFile::ty peBinary);

// запись в файл строки
m_Text=m_Text+" ";
File.WriteString((LPCTSTR)m_Text);
cout << "Load string = " << m_Text << endl;
}
}
}
Но, к сожалению столкнулся с другой проблемой. Все строки записываются в первую строку файла temp.txt, то есть, сколько бы строк не было в исходном файле в мой файл сохраняется только одна - последняя.
Соответственно вопрос: как организовать переход на следующую строку при записи, вышеуказанным методом? И второй вопрос: как узнать количество строк в файле, из которого я читаю?

Спасибо!
alexei-evil вне форума Ответить с цитированием
Старый 19.07.2010, 19:53   #3
D@rkD@iver
Форумчанин
 
Регистрация: 28.07.2009
Сообщений: 189
По умолчанию

Да использовал бы стандартую С++ библиотеку <stdio.h>
FILE*f;
пишу программы для студентов и школьников на Pascal, Delphi, C++, WINAPI, assembler
обучаю программированию на паскале(дистанционно);mail: hruslow@gmail.com
D@rkD@iver вне форума Ответить с цитированием
Старый 19.07.2010, 20:04   #4
alexei-evil
 
Регистрация: 12.04.2010
Сообщений: 7
По умолчанию

Для: D@rkD@iver
Дело в том, что необходимо организовать для пользователя возможность выбора файла для обработки. А как это организовать с помощью <stdio.h> ? Я не смог ничего найти по этому вопросу. Все примеры в учебниках описывают чтение из файла путь, к которому явно указан в программе. Например: С://temp//file.txt А если я не знаю имя файла и где он находится, то не могу указать и путь к нему.

Может подскажите способ с применением <stdio.h>
Или хотя бы каую-нибудь книгу где эта библиотека максимально подробно описана?
alexei-evil вне форума Ответить с цитированием
Старый 02.08.2010, 17:18   #5
drNabla
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 87
По умолчанию

Здравствуйте.
Прочитал вашу тему про запись и чтение из txt файла в С++ MFC, просто я столкнулся с такой же проблемой, и моих знаний и опыта не хватает для того чтоб решить этот вопрос. Вот и хочу попросить чтоб вы посоветовали что можно почитать по этому поводу, и вообще хорошие книги по Visual Studio, а то малоли какие трудности ещё по ходу могут возникнуть. А второе - если у вас получилось решить эту пробему, не моглибы вы поделиться решением, мне бы это очень сильно помогло как учебный пример.
Заранее спасибо.
drNabla вне форума Ответить с цитированием
Старый 02.08.2010, 18:39   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Собственно, сделать диалог для пользователя нетрудно:
Код:
CFileDialog aFD(true);          // Создать объект стандартного диалога выбора файлов
aFD.m_ofn.Flags |= OFN_FILEMUSTEXIST;                // Выбранный файл должен существовать
aFD.m_ofn.lpstrTilte = "Open TXT file";                    // Заголовок диалога
aFD.m_ofn.lpstrFilter = "Text files (*.txt)\0*.txt";      // Фильтр
aFD.m_fon.lpstrInitialDir = NULL;                       // Открыть в текущем каталоге
if(aFD.DoModal() == IDCANCEL) return;                  // Запустить
CString NameWithDir = aFD.m_ofn.lpstrFile;             // Выбор пользователя с путем
        NameWithoutDir = aFD.m_ofn.lpstrFileTitle;          // ... без путя
А делается это обычно в CApplicationView::OnFileOpen()
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 02.08.2010 в 18:44.
Syuf вне форума Ответить с цитированием
Старый 02.08.2010, 18:50   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Строки можно читать так:
Код:
CStdioFile file;
file.Open( /* CString */ NameWithDir, CFile::modeReadWrite /* Чтение и запись */
     | CFile::shareExclusive /* Открыть в монопольном режиме */ | CFile::typeText /* Открыть в текстовом режиме */);
CString aStr;
do
{
     file.ReadString(aStr);
     // Действия с aStr
} while(!aStr.IsEmpty());
file.Close();
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.08.2010, 19:02   #8
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Вы посмотрите в Интернете - все я вам все равно написать не смогу, а класс CFileDialog - хорошая довольно-таки вещь с большими возможностями. И не стоит MFC осваивать "между делом" - большинство возможностей останется в стороне. Могу еще позанудствовать, но нету времени - посмотрите, короче, тут:
http://www.cyberguru.ru/programming/...rs-page34.html
http://msdn.microsoft.com/en-us/libr...e7(VS.80).aspx
http://www.firststeps.ru/mfc/steps/r.php?15
http://www.dotnetheaven.com/Uploadfi...gTutorial.aspx
http://www.codersource.net/mfc/mfc-t...iledialog.aspx
http://www.rsdn.ru/Forum/Info/FAQ.mf...winnt0500.aspx
Или в общем случае - тут:
http://www.google.ru/search?source=i...=&oq=&gs_rfai=
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 05.08.2010, 19:01   #9
drNabla
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 87
По умолчанию

спасибо, думаю мне всё это очень пригодится)
drNabla вне форума Ответить с цитированием
Старый 01.09.2010, 19:50   #10
drNabla
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 87
По умолчанию

А может ктони будь может это сделать только в моногооконном приложении сделанном AppWizard? а то уже месяц бьюсь дальше открытия файла там не продвинулся....
drNabla вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Visual C++ MFC Запись/чтение в файл qazzz Фриланс 3 19.03.2010 22:02
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11
Чтение/запись в файл в StringGrid SVadiks Помощь студентам 0 03.12.2009 22:14
Запись в файл и чтение из него. Swool Общие вопросы C/C++ 8 26.08.2008 16:39