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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2009, 09:10   #1
nusik
Форумчанин
 
Регистрация: 13.04.2009
Сообщений: 117
Лампочка Добавление текста к существующему файлу

Привет всем.
Записываю текст в файл таким образом.
Код:
CString  filter="Text file|*.txt||",defext="txt";
	CFileDialog fSaveDlg(false,defext, NULL, OFN_HIDEREADONLY|OFN_PATHMUSTEXIST ,filter,this);
	if (fSaveDlg.DoModal()==IDOK)
	{	
        EDITSTREAM es;
		CString path=fSaveDlg.GetPathName();
		CFile cFile(path,CFile::modeCreate|CFile::modeNoTruncate); 
		        
        es.dwCookie = (DWORD) &cFile;
	    es.pfnCallback =FileStreamOutCallback; 
	    m_richedit.StreamOut(SF_TEXT|SF_UNICODE , es);	
	}
Проблема такая: хочу чтобы при след. сохранении данные просто дописывались в файл.
заранее спс.
nusik вне форума Ответить с цитированием
Старый 30.07.2009, 12:58   #2
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

у меня нет mfc но скажу что делать, когда инициализруешь CFile откой его с флагом не modeCreate а что то типо readwrite переместися на конец файла, для этого узнай его размер, и можно дописывать
lennon вне форума Ответить с цитированием
Старый 30.07.2009, 13:06   #3
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

MSDN
Код:
virtual ULONGLONG Seek(
   LONGLONG lOff,
   UINT nFrom 
);
Код:
CFile cfile;
cfile.Open(_T("Seek_File.dat"), CFile::modeCreate |
   CFile::modeReadWrite);
LONGLONG lOffset = 1000;
ULONGLONG lActual;
lActual = cfile.Seek(lOffset, CFile::begin); // Тут должен быть флаг с конца файла, и смещение 0
psycho-coder вне форума Ответить с цитированием
Старый 30.07.2009, 15:07   #4
nusik
Форумчанин
 
Регистрация: 13.04.2009
Сообщений: 117
По умолчанию

Спасибо
в итоге нечто такое получилось:
Код:
  CString  filter="Text file|*.txt||",defext="txt";
	CFileDialog fSaveDlg(false,defext, NULL, OFN_HIDEREADONLY|OFN_PATHMUSTEXIST ,filter,this);
	if (fSaveDlg.DoModal()==IDOK)
	{	
        EDITSTREAM es;
	  	CString path=fSaveDlg.GetPathName();
	    CFile cFile;
    		
		cFile.Open(path, CFile::modeNoTruncate |
		CFile::modeReadWrite);
		LONGLONG lOffset = 0;
		ULONGLONG lActual;
		lActual = cFile.Seek(lOffset, CFile::end); // Тут должен быть флаг с конца файла, и смещение 0
		cFile.SeekToEnd();
		      
        es.dwCookie = (DWORD) &cFile;
	    es.pfnCallback =FileStreamOutCallback; 
		CString BeforeWriting; m_richedit.GetWindowTextW(BeforeWriting); 
		m_richedit.SetWindowTextW(_T("\xD\xd\xd\xd")+BeforeWriting);
	    m_richedit.StreamOut(SF_TEXT|SF_UNICODE , es);	
		m_richedit.SetWindowTextW(BeforeWriting);
	}
Но остался один малеьнкий вопрос
когда на другом компе открываю полученный файл через блокнот
выходят символы-квадратики, видимо перевод строки не воспринимает.
в чем причина? так поможет:
Код:
m_richedit.SetWindowTextW(_T("\xD\xA\xd\xA\xd\xA\xd\xA")+BeforeWriting);
nusik вне форума Ответить с цитированием
Старый 30.07.2009, 15:12   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Перевод строки в Винде это два символа с кодами 13 и 10.
Первый перевод строки, а второй возврат каретки.
Если одного символа нет, то перехода не будет, а будут квадратики.

Попробуйте так:
Код:
m_richedit.SetWindowTextW(_T("\r\n\r\n\r\n\r\n")+BeforeWriting);
psycho-coder вне форума Ответить с цитированием
Старый 30.07.2009, 15:41   #6
nusik
Форумчанин
 
Регистрация: 13.04.2009
Сообщений: 117
По умолчанию

Цитата:
Перевод строки в Винде это два символа с кодами 13 и 10.
где-т видел - иногда только 13 тож работает, я так понял что 13 и 10 везде работать будет, а нам это и надо.
Спасибо.
nusik вне форума Ответить с цитированием
Старый 30.07.2009, 15:50   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от nusik Посмотреть сообщение
где-т видел - иногда только 13 тож работает
В консоле только 13 можно


В Linux код обрыва строки 13
В MacOS код 10
psycho-coder вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ListView добавление текста в две колонки Shouldercannon Общие вопросы Delphi 3 02.04.2010 21:18
TStrings и посимвольное добавление текста soleil@mmc Общие вопросы Delphi 2 17.04.2009 17:45
Путь к файлу artemavd Общие вопросы Delphi 12 24.03.2009 14:09
Путь к файлу Баламут Win Api 12 14.05.2008 13:27
Путь к файлу Лубышев Общие вопросы Delphi 2 10.02.2008 21:13