Работа с файлами в Win32 API

Статус: Offline
Реєстрація: 28.01.2009
Повідом.: 176
Работа с файлами в Win32 API

Нужно все данные с List-View хранить в файле, но опять надо с типами что-то сделать:

long FilePos=0;
HANDLE hFile;
DWORD FPointer;
HGLOBAL hGlobalMemory;
LPVOID WINAPI pGlobalMemory;
LPDWORD lpdw;

wchar_t wstr[50], *lpwstr;
wchar_t* pDst;
lpwstr=wstr;


hFile=CreateFile(_T("data.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL);

FPointer=SetFilePointer(hFile,FilePos,0,FILE_CURRENT);

// Записываю строку в буффер чтобы потом с буффера записать ее в файл

hGlobalMemory = GlobalAlloc(GHND,sizeof(wstr) + 1);
pGlobalMemory = GlobalLock(hGlobalMemory);
pDst = (wchar_t*) pGlobalMemory;
for(int i = 0; i < (sizeof(wstr) + 1); i ++)
*pDst++ = *lpwstr++;

WriteFile(hFile,pGlobalMemory,sizeof(wstr),lpdw,NULL);


Можно ли без записи в буфер записать строку wchar_t в файл?

Исправил код, ошибок нет нов файл ничего не пишет
 
Останнє редагування:
Нужно все данные с List-View хранить в файле, но опять надо с типами что-то сделать:


.\kurs.cpp(712) : error C2036: LPVOID: неизвестный размер
.\kurs.cpp(712) : error C2100: недопустимое косвенное обращение
.\kurs.cpp(712) : error C2440: =: невозможно преобразовать 'wchar_t' в 'LPVOID'

Можно ли без записи в буфер записать строку wchar_t в файл?

Можно.

1 - что такое встр? И почему его размер ты берешь сизеофом? Это зараннее аллоцированный на стеке буфер? Но зачем тогда +1?
2 - Воид нельзя инкрементить и присваивать, так как размер данных за ним неизвестен.
3 - Правильное копирование будет выглядить так:
*((wchar_t*) pGlobalMemory)++ = *lpwstr++
Но при єтом сдвинеться pGlobalMemory а он может понадобиться в будущем, посему лучше всего написать вот так:
wchar_t* pDst = (wchar_t*) pGlobalMemory;
for(int i = 0; i < (sizeof(wstr) + 1); i ++)
*pDst++ = *lpwstr++;

Однако что бы файл читался во всех вьюверах нормально, необходимо руками ставить специальный маркер (погугли какой) возможно есть флажки при создании файла, однако я пользуюсь чистыми сишными функциями, специальный флаг с кодировкой у меня там так использовать и не получилось, поэтому делаю маркер вручную.
 
Я исправил код (вверху) но всё-равно не работает
 
КлосеХэндл вызываю, в Криэйте стоит флаг OPEN_EXISTING, но даже при создании файл не создается

Что приходит в лпдв? - хз, не проверял, да и как?
 
Опен Экзистинг я не заметил... Если мне память не изменяет в этом случае фал открываеться только если он есть...
1 - что бы посмотреть лпдв поставь бряку в дебагере или число преобразуй строку и вызови месседж бокс.
2 - Оберни все вызови апи получением результате операции. Там где не 0 там и ошибка а какая именно поможет узнать иррор лукап из стандартного набора студии (Вбиваешь туда результат), можешь почитать про иррор хендлинг и сразу выводить в месседж бокс мессагу.
3 - Пока больше ничем помч не могу, так как дома не пишу проги пренципиально. Во вторник, если не розберешся соберу на работе твой код, скажу точнее.
 
+1 лишнее
в wstr[50] находится строка или это массив символов?
если последнее то нужно выделять sizeof(wstr) + sizeof(wchar_t) и дописывать в конце '\0'
 
Возможно проще работать через
std::wifstream fin(ofn.lpstrFile); - создание потока файла
и
GetOpenFileName(LPOPENFILENAMEW); ???
case ID_OPEN:
ofn.lpstrTitle = _T("Open File");
ofn.Flags = OFN_FILEMUSTEXIST;


if (GetOpenFileName(&ofn))
{
std::wifstream fin(ofn.lpstrFile);
std::wstring text, buf;


while (fin)
{
std::getline(fin, buf);
text += buf;
text += _T("\n");
}

SetWindowText(ChildHandles[hWnd], text.c_str());
fin.close();
SetWindowText(hWnd, openName);
}
break;

// вызываем диалог сохранения файла и сохраняем файл
case ID_SAVE_AS:

ofn.lpstrTitle = _T("Save File");
ofn.Flags = 0;

if (GetSaveFileName(&ofn))
{
std::wofstream fout(ofn.lpstrFile);
TCHAR *buf;
size_t size;
GETTEXTLENGTHEX INFO;
INFO.flags = GTL_DEFAULT;
INFO.codepage = 1200;

size = SendMessage(ChildHandles[hWnd], EM_GETTEXTLENGTHEX, (WPARAM)&INFO, 0);
buf = new TCHAR[size];
GetWindowText(ChildHandles[hWnd], buf, size);
fout << buf;

delete[] buf;
fout.close();
SetWindowText(hWnd, openName);
}
break;
 
#include <fstream.h>

void main
{
ofstream file("file.txt");
file<<"Hello file\n"<<75; //write to it
}


:) если шо :) еще около 3-4 строк и получается ваша прога. :)
 
если открываете/создаете файл, наверное неплохо былоб и закрывать
я просто весь код не показал

#include <fstream.h>

void main
{
ofstream file("file.txt");
file<<"Hello file\n"<<75; //write to it
}


если шо еще около 3-4 строк и получается ваша прога.

Я получаю от функции GetWindowText указатель LPWSTR на строку - как мне ее в файл записать?
 
я просто весь код не показал
Я получаю от функции GetWindowText указатель LPWSTR на строку - как мне ее в файл записать?

конвертировать и записать что то типа так:

char temp[20];
LPWSTR str = L"123";
wcstombs(temp, str, 4);
cout<<temp;

ну или как нить по другому. но это в любом случае не повод превращать свой код в не читаемый суржик из C и C++
 
конвертировать и записать что то типа так:

char temp[20];
LPWSTR str = L"123";
wcstombs(temp, str, 4);
cout<<temp;

ну или как нить по другому. но это в любом случае не повод превращать свой код в не читаемый суржик из C и C++
Бред написал.

Можно как-нить так:
Код:
#include <tchar.h>

....

TCHAR tszString[100];
...
::GetWindowText(...);

FILE * fp = _tfopen(_T("file.txt"), _T("wt") );
if (fp)
{
   _ftprintf(fp, _T"%s\n",  tszString);
  fclose (fp);
}

И ничего не мешает тебе для тчаровских строк написать вместо
Код:
std::ofstream file("file.txt");
Код:
typedef std::basic_ofstream<TCHAR, char_traits<TCHAR> > tofstream;
std::tofstream file(_T("file.txt"));
file << tszString << std::endl;
 
Во-первых wcstombs() работает коряво, во-вторых cout выведет строку на экран, а не в файл. В-третьих не проще ли воспользоваться "широкой" функцией?

Во-первых если wcstombs() входящая в состав стандартного C++ работает коряво, то предлагаю перестать программить на C++ как на корявом языке.

Во-вторых в cout вывел что бы можно было легко протестировать как оно работает и в принципе, подставь туда другой поток и все в поряде.

В-третих можно вообще не пользоваться благами C++ такими как скажем потоки, плюнуть на все и писать все структурно в стиле C, избегая корявых левых функций стандартного языка и писать свои, ну типа раз они с могли, значит фигли мне такому бойкому пацану не написать по-новой, так надежнее в разы :D
 
В-третих можно вообще не пользоваться благами C++ такими как скажем потоки, плюнуть на все и писать все структурно в стиле C, избегая корявых левых функций стандартного языка и писать свои, ну типа раз они с могли, значит фигли мне такому бойкому пацану не написать по-новой, так надежнее в разы :D
Не утрируй. Я выше привёл вариант с выводом в "широкий" поток на C++
 
если открываете/создаете файл, наверное неплохо былоб и закрывать

А деструктор обїекта зачем?

конвертировать и записать что то типа так:

char temp[20];
LPWSTR str = L"123";
wcstombs(temp, str, 4);
cout<<temp;

ну или как нить по другому. но это в любом случае не повод превращать свой код в не читаемый суржик из C и C++

Конввертировать нах? std::wofstream забанен?

Во-первых если wcstombs() входящая в состав стандартного C++ работает коряво, то предлагаю перестать программить на C++ как на корявом языке.

Во-вторых в cout вывел что бы можно было легко протестировать как оно работает и в принципе, подставь туда другой поток и все в поряде.

В-третих можно вообще не пользоваться благами C++ такими как скажем потоки, плюнуть на все и писать все структурно в стиле C, избегая корявых левых функций стандартного языка и писать свои, ну типа раз они с могли, значит фигли мне такому бойкому пацану не написать по-новой, так надежнее в разы :D
Не умничай. Судя по тому, что ты пишешь, тебе еще очень далеко что бы спорить с Убивцем.
Если ты не знаешь, что я тебя просвещу, что стандартные функции пишут люди, и в них тоже есть баги, парпочку правил лично, это раз.
Во вторых функции для работы с юникодом, что в ЖЦЦ, которое ставиться с КОдэвариором на Леопарде, что в 2003 студии нихера не умеют коректно работать с юникодом, и приходиться либо что-то писать самому либо использовать функции ОС ;)
И наконец - СТЛ удобен, не спорю, но сука тяжелый, СТЛные контейнеры, если их подвязать к гую даж на самой быстрой тачке подвесят прорисовку списков и прочей фигни на раз. АТЛ в этом плане разрывает СТЛ в клочья.
Учи матчасть.

Не утрируй. Я выше привёл вариант с выводом в "широкий" поток на C++

Друг мой, вы страшный человек :)
 
Ничего не получается - просто не пишет ничего в файл((

Я ввел текст в окошко Edit:
Код:
wchar_t wstr[50], *lpwstr;
lpwstr=wstr;
GetWindowText(hEdit1,lpwstr,50);
Дальше должна следовать запись в файл data333.txt :confused:
 
я просто весь код не показал

Я получаю от функции GetWindowText указатель LPWSTR на строку - как мне ее в файл записать?

Правильно ты делал с самого начала. Нахер никому не нужны эти конвертации.
Попробуй вместо текста из эдита вывести в файл обычную строку. Будет ли он создан со строкой?
 
Назад
Зверху Знизу