Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Запись в файл


Автор: piratus 12.8.2003, 15:26
Подскажите как записать данные из ListBox в файл.

Автор: Step 12.8.2003, 15:28
читаешь по строчно, и пишешь... в чем проблемма собственно

Автор: SCHEPA 12.8.2003, 22:05
Гораздо проще:
ListBox->Items->SaveToFile(FileName);

Автор: Step 13.8.2003, 09:18
SCHEPA, так то легче если это борланд, а если визуал, то не получиться...

Автор: Baa 13.8.2003, 10:35
Знаю, как иногда бывают проблемы даже с простыми вещами и как иногда не хватает кода (когда-то ведь тоже учился, посему...)
Посторался обойтись без MFC, но так как приложение было сделано на его основе, все же пару функция пришлось использовать
Код

HWND hWnd = AfxGetApp ()->m_pMainWnd->m_hWnd;
char szFileName [] = "c:\\listbox.txt";
char* lpString = new char [0xFF];
//заполняем наш ListBox
lstrcpy (lpString, "First Item");
::SendDlgItemMessage (hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) lpString);
lstrcpy (lpString, "Second Item");
::SendDlgItemMessage (hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) lpString);
lstrcpy (lpString, "Third Item");
::SendDlgItemMessage (hWnd, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) lpString);

//теперь надо создать файл и внести в него содержимое нашего ListBox'а

//создаем файл и открываем его только для записи
HANDLE hFile = CreateFile (szFileName,
       GENERIC_WRITE,
       NULL,
       NULL,
       CREATE_ALWAYS,
       NULL,
       NULL);
//если файл создался и открылся, то выполняем наши действия, но сначала стоит проверить;-)
if (hFile != INVALID_HANDLE_VALUE)
{
 DWORD dwCount = (DWORD)::SendDlgItemMessage (hWnd, IDC_LIST1, LB_GETCOUNT, 0, 0); //получаем количество строк
 for (DWORD i = 0; i < dwCount; i++)
 {
  ::SendDlgItemMessage (hWnd, IDC_LIST1, LB_GETTEXT, i, (LPARAM) (LPCTSTR) lpString); //получим элемент listbox'а
  lstrcat (lpString, "\xD\xA"); //добавим перенос строки
  DWORD dwBytesCount;
  WriteFile (hFile, (LPCVOID) lpString, lstrlen (lpString), &dwBytesCount, NULL);//запишем в файл элемент
 }
 CloseHandle (hFile);//закроем наш файл
}

delete [] lpString;//удалим временный буфер

Автор: Step 13.8.2003, 11:28
тоже самое на мфс
Код

CString str,str2;
for (int i=0;i < 10;i++)
{
  str.Format(_T("item string %d"), i);
  pmyListBox.AddString( str );
}
// создание файла
CFile fl;

fl.Open("filename.txt",  CFile::modeCreate| CFile::modeWrite );
// получение данніх
int n;
  for ( i=0;i < pmyListBox.GetCount();i++)
  {
     n = pmyListBox.GetTextLen( i );
     pmyListBox.GetText( i, str.GetBuffer(n) );
     str.ReleaseBuffer();
// группировка данных
     str.Format("%s\r\n",str.GetBuffer(0));
  str2+=str;
     
  }
//Запись данных
fl.Write(LPCSTR(str2),str2.GetLength());
fl.Close();

Автор: mr.DUDA 13.8.2003, 21:07
А вот пример еще легче
Код

try
{
     CFile file("filename.txt", CFile::modeCreate | CFile::modeWrite);
     CArchive ar(&file, CArchive::store);
     CString str;    
     for(int i=0; i < myListBox.GetCount(); i++)
     {
           myListBox.GetText(i, str);
           ar<<str;
     }
}
catch(...)
{
     ::MessageBox(0, "Some file error", "Error", MB_OK);
}


Автор: Step 14.8.2003, 09:09
Baa, хорошая подборка для факю получилась, вставляй...

Автор: Baa 19.8.2003, 15:25
Кстати говоря, мой пример работает в 10 раз быстрее остальных. Мне показалось, что это из-за перераспределения памяти у CString в цикле, добавил в своём примере, что строка создается аккурат по размеру итема, код стал тормозней, но по скорости все равно привосходит Step'ов пример в 5 раз, а пример mr.DUDA в 3 раза. Если нужна скорость, то MFC - Must Die smile.gif
WinApi записывает 10000 элеметов за 100-110 тиков.
Если не перераспределять память в цикле, то получается 30-40 тиков.
А Builder это делает за 80 тиков.

Автор: mr.DUDA 19.8.2003, 15:54
Baa, нет предела совершенству

Автор: Step 21.8.2003, 09:31
Baa, MFC - Must Die, придется попробывать оптимизировать, дабы поднять мфц

Автор: mr.DUDA 21.8.2003, 14:55
Кто в здравом уме и твердой памяти будет оптимизировать по максимуму запись в файл из ListBox'а ?

Насчет тормознутости MFC согласен, только товарищи, не говорите про тормоза, компилируя и запуская прогу в Debug-конфигурации smile.gif (эй, не надо гнилых помидоров, я только на всякий случай сказал)...

Автор: Baa 21.8.2003, 15:57
Ща потестим её на PIV 2000
мда... результаты - бред...
109 294 260
медленнее, чем на моем третем пне...

Автор: DENNN 21.8.2003, 20:03
ОС загружена по разному и в разных сервис-паках внутренний механизм для обмена сообщениями с контролами отличается

Автор: Baa 22.8.2003, 10:47
ОСь загруженна по минимуму (обе), сервиспаки стоят одни и те же.

Автор: RAN 22.8.2003, 11:19
Модератор: Baa, как модератор модератора прошу smile.gif : Давайте вернёмся к теме обсуждения

Автор: Baa 22.8.2003, 11:46
RAN, так мы и обсуждаем запись итемов из листбокса и файл smile.gif а точнее лучший из способов wink.gif быстродействие, типа wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)