Змінюй хід війни! Допомагай ЗСУ!

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

  • Автор теми Автор теми inferno_99
  • Дата створення Дата створення
Бред написал.

Можно как-нить так:
Код:
#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);
}

Во-первых у меня указатель LPWSTR на строку, а не TCHAR*, тоесть надо ещё преобразовать wcstombs((CHAR*)tszString,lpwstr,48).
Во-вторых выдает ошибку при работе программы

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

Да меня уже все запутали - не знаю че делать((( коментариев больше чем кода:D
 
Во-первых у меня указатель LPWSTR на строку, а не TCHAR*, тоесть надо ещё преобразовать wcstombs((CHAR*)tszString,lpwstr,48).
Во-вторых выдает ошибку при работе программы


Да меня уже все запутали - не знаю че делать((( коментариев больше чем кода:D

Ты меня доведешь, что я скоро ради тебя студию дома поставлю :D
В куске твоего кода (пост от 12 05) там где сэйв сделай небольшие изменения:
Код:
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;
fout << L"Hello World!";
TCHAR* tszHeader = sizoef(TCHAR) == 1 ? _T("Ansi string") : _T(UTF-16 String");
MessageBox(buf, tszHeader, MB_OK);
delete[] buf;
fout.close();
SetWindowText(hWnd, openName);

Запусти скомпилируй и должи о результатх віполнения ;) Появился ли фвйл что выпало в месседж боксе?

По поводу кода убивца - где то так:
Если у тебя стоит флаг юникод в настройках проекта, то TCHAR* эквивалентен LPWSTR. А что за ошибка? Неуж-то краш при записи в файл? У меня подозрения что что то не то у тебя с буффером.
 
error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "ofn"
в строке
OPENFILENAME ofn;
Че за херня????
 
Значит так, подключил
#include <fstream>
#include <commdlg.h>
Пишу:
Код:
ofstream fout("data333.txt");
fout << _T("Hello World!");
В файле data333.txt никаких изменений нет
 
Странно. В настройках проекта стоит юникод или мультибайт? Чему равен ышяуща(TCHAR) в єтом коде?
Такая херня можеть быть из-за рассогласования типов чар и вчар, но какого юха в этом случае молчить компиллер?
 
в настройках проекта юникод
 
Тогда тебе необходимо использовать std::wofstream
 
Вопрос:
Как считывать с файла c определённого места и писать начиная с определённого места? Желательно с помощью файловых потоков (std::wofstream)
 
std::wofstream - поток вывода. Причом как му уже убедились каряво написанный, по крайней мере в 2003 студии. ****ы блин. Придеться тебе наверное переходить на stdio.h
 
а считать с файла в строку как?
 
Все зависит от того, что ты понимаешь под понятием строка. Если набор непробельных символов разделенных пробельными - то это легко. Если же набор символов с терминатором (обычно это \n, \r\n, \0) то тут не все так простом :( В СТЛ был баг (возможно уже пофикшен), со scanf есть **** со строкой выборки, у меня он так и не заработал, возможно у меня руки кривые, возможно баг. Я писал спец функцию :(
 
fgets(), а если как двоичный файл, то fread()
 
Вопрос:
Как считывать с файла c определённого места и писать начиная с определённого места? Желательно с помощью файловых потоков (std::wofstream)

.seekp()



Вот все работает.


Код:
#include "stdafx.h"
#include <fstream>
#include <TCHAR.H>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,".1251");

	{
		wofstream wide_file("test.txt");
		wide_file.imbue(locale("rus_rus.1251"));
		wide_file<<L"Тест-Test";
	}

	{
		wchar_t test[50];
		wifstream wide_file("test.txt");
		wide_file.imbue(locale("rus_rus.1251"));
		wide_file>>test;
		wcout<<test;
	}

	system("pause");
	return 0;
}
 
Останнє редагування:
Вот все работает.
Вітаю. Але де сабж (Win32 API)?

Наведу моє бачення проблеми:
Код:
include 'win32wx.inc'

.data

  szFile TCHAR "note.txt", 0
  wc WNDCLASS 0, WindowProc, 0, 0, NULL, NULL, NULL, COLOR_BTNFACE + 1, NULL, szFile
  hWndEdit dd ?
  msg MSG
  client RECT

.code

  start:

    invoke  GetModuleHandle, 0
    mov     [wc.hInstance], eax

    invoke  RegisterClass, wc
    .if eax
      invoke  CreateWindowEx, 0, eax, szFile, WS_VISIBLE + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 256, 256, NULL, NULL, [wc.hInstance], NULL

      .while eax
        invoke GetMessage, msg, NULL, 0, 0
        .if eax & (eax <> -1)
          invoke TranslateMessage, msg
          invoke DispatchMessage, msg
          or eax, TRUE
        .endif
      .endw

    .endif

    invoke  ExitProcess, [msg.wParam]

.end start

  proc WindowProc hWnd, wMsg, wParam, lParam
    local hFile : DWORD, hMap : DWORD, pMemory : DWORD

    .if [wMsg] = WM_CREATE

      invoke  GetClientRect, [hWnd], client

      invoke  CreateWindowEx, WS_EX_CLIENTEDGE, "EDIT", 0, WS_VISIBLE + WS_CHILD + WS_HSCROLL + WS_VSCROLL + ES_AUTOHSCROLL + ES_AUTOVSCROLL + ES_MULTILINE, [client.left], [client.top], [client.right], [client.bottom], [hWnd], 0, [wc.hInstance], NULL
      mov [hWndEdit], eax
      .if [hWndEdit]

        invoke  CreateFile, szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
        .if eax <> INVALID_HANDLE_VALUE
          mov     [hFile], eax

          invoke  CreateFileMapping, [hFile], NULL, PAGE_READONLY, 0, 0, NULL
          .if eax
            mov     [hMap], eax

            invoke  MapViewOfFile, [hMap], FILE_MAP_READ, 0, 0, 0
            .if eax
              mov     [pMemory], eax

              invoke  SetWindowText, [hWndEdit], [pMemory]

              invoke  UnmapViewOfFile, [pMemory]

            .endif

            invoke  CloseHandle, [hMap]

          .else

            mov     [hMap], 0

          .endif

          invoke  CloseHandle, [hFile]

        .endif

        xor     eax, eax

      .else

        or      eax, -1

      .endif

    .elseif [wMsg] = WM_SIZE

      invoke  GetClientRect, [hWnd], client

      invoke  MoveWindow, [hWndEdit], [client.left], [client.top], [client.right], [client.bottom], TRUE

      xor     eax,eax

    .elseif [wMsg] = WM_SETFOCUS

      invoke  SetFocus, [hWndEdit]

      xor     eax,eax

    .elseif [wMsg] = WM_DESTROY

      .if [hWndEdit]

        invoke  CreateFile, szFile, GENERIC_READ + GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
        .if eax <> INVALID_HANDLE_VALUE
          mov     [hFile], eax

          invoke  GetWindowTextLength, [hWndEdit]
          .if eax

            shl eax, 1
            invoke  CreateFileMapping, [hFile], NULL, PAGE_READWRITE, 0, eax, NULL
            .if eax
              mov     [hMap], eax

              invoke  MapViewOfFile, [hMap], FILE_MAP_WRITE, 0, 0, 0
              .if eax
                mov     [pMemory], eax

                invoke  GetWindowTextLength, [hWndEdit]
                inc eax
                invoke  GetWindowText, [hWndEdit], [pMemory], eax

                invoke  UnmapViewOfFile, [pMemory]

              .endif

              invoke  CloseHandle, [hMap]

            .endif

          .endif

          invoke  CloseHandle, [hFile]

        .endif

      .endif

      invoke  PostQuitMessage, 0

      xor     eax, eax

    .else

      invoke  DefWindowProc, [hWnd], [wMsg], [wParam], [lParam]

    .endif

    ret

endp
 
Люди, есть по 7 наборов строк для каждой записи:
айтем0: строка строка строка строка строка строка строка
айтем1: строка строка строка строка строка строка строка
айтем2: строка строка строка строка строка строка строка
айтем3: строка строка строка строка строка строка строка

Нужно организовать запись этих строк в файл при выходе из проги, и чтение при входе в программу, как это лучше сделать? (нужно в юникоде wchar_t)

А самое главное - различать чтение каждой строки, так как нужно присвоить её определённому айтему
 
Пиши в Аську :) Понадобиться структурированная запись в файл , наподобии той, ято я прислал тебе вчера, придеться повозиться, но это несмертельно. Кста код который я те вчера кинул заработал у тебя?
 
Записываю:

Код:
case WM_DESTROY:
		{
			FILE* fOut = fopen("D:\\Study\\SP\\Kursova\\kurs\\data", "wb");
			
			Record Data[100];
			for(int j=0;j<NumberOfItems;j++)
			{
				ListView_GetItemText(ListE,j,0,Data[j].Surname,Max_Symbols);
				ListView_GetItemText(ListE,j,1,Data[j].Name,Max_Symbols);
				ListView_GetItemText(ListE,j,2,Data[j].Otchestvo,Max_Symbols);
				ListView_GetItemText(ListE,j,3,Data[j].HomeAdress,Max_Symbols);
				ListView_GetItemText(ListE,j,4,Data[j].WorkAdress,Max_Symbols);
				ListView_GetItemText(ListE,j,5,Data[j].Phone,Max_Symbols);
				ListView_GetItemText(ListE,j,6,Data[j].Notes,Max_Symbols);
			};			
			fwrite((const void*)Data, sizeof(Record) * 100, 1, fOut); 


			PostQuitMessage(0);
			break;
		}


Читаю:

Код:
case WM_CREATE:
		{
...
...

			FILE* fIn = fopen("D:\\Study\\SP\\Kursova\\kurs\\data", "rb");

			Record Data[100];
			fread((void*)Data, sizeof(Record) * 100, 1, fIn);

			for(int j=0;j<2;j++)
			{
				ListView_InsertItem(ListE,1);
				ListView_GetItemText(ListE,j,0,Data[j].Surname,Max_Symbols);
				ListView_GetItemText(ListE,j,1,Data[j].Name,Max_Symbols);
				ListView_GetItemText(ListE,j,2,Data[j].Otchestvo,Max_Symbols);
				ListView_GetItemText(ListE,j,3,Data[j].HomeAdress,Max_Symbols);
				ListView_GetItemText(ListE,j,4,Data[j].WorkAdress,Max_Symbols);
				ListView_GetItemText(ListE,j,5,Data[j].Phone,Max_Symbols);
				ListView_GetItemText(ListE,j,6,Data[j].Notes,Max_Symbols);
			};



			break;
		}

Вот ошибка. Что подправить нужно?
 

Вкладення

  • Error.webp
    Error.webp
    10.2 КБ · Перегляди: 84
Назад
Зверху Знизу