Просмотр полной версии : [C++]Получение данных из оперативной памяти
Программа считывает матрицу из файла и записывает все данные в динамический массив.У кого нибудь есть ли идеи как получить эти данные(матрицу считанную из файла) из оперативной памяти?
а что тут получать? у тебя есть имя массива. &array[0] - адрес на первый элемент массива в оперативной памяти) на второй ты догодываешься какой будет?
Я не знаю размерность массива.
А sizeof не помогает узнать размер?
только в момент компиляции.
А допустим я хочу прочитать какой-то определенный сектор памяти, и запихнуть его в массив.
Ни кто не знает как это сделать.
Ведь нельзя самому задавать адреса.
Программа считывает матрицу из файла и записывает все данные в динамический массив.
Ну дк в чем проблема обратится к этому массиву?
Я не знаю размерность массива.
Что значит не знаю? Она же вычисляется каким то образом.
Ну вообще,все немного сложнее.Файл делится на несколько кусков,программа берет кусок из файла,записывает его в массив,потом я должен считать этот массив,в итоге я должен собрать все эти массивы в один.
Динамические типы данных для этого и созданы. Разве нет?
Как получить динамические данные? Через указатель получаешь первый элемент, второй будет указатель + 1... сформулируй проблему точнее.
Нет,это я прекрасно понимаю)
Как определить размер массива в который я буду складывать куски,вот в чем вопрос.
Пока у меня одна идея,считать кол-во элементов файла.Может быть у вас есть другие идеи?
Ну есть же прекрасный vector, чем он тебе не подходит? считал данные из файла загнал в вектор, потом обрабатываешь, зачем еще над чем то заморачиватся )
int SizeOfFile(FILE * file)
{
int size;
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
return size;
}
Chaak,мою идею реализовал?
Это извращение, зачем упрямо обходить преимущества языка. Смотри в сторону векторов.
Ну вообще,все немного сложнее.Файл делится на несколько кусков,программа берет кусок из файла,записывает его в массив,потом я должен считать этот массив,в итоге я должен собрать все эти массивы в один.
у тебя что, отделены эти функции, и к первой ты не имеешь отношения? Т.е. ктото за тебя считывает кусок и грузит, а ты должен загруженный переформировать в массив? Если да, то задача уебищна по определению. Если нет - то перепиши все более логично, чтобы считывание делалось в массив или вектор, как уже отмечали. Работа с массивом, заданным чистым указателем все таки минное поле, которого лучше избегать.
Программа считывает матрицу из файла и записывает все данные в динамический массив.У кого нибудь есть ли идеи как получить эти данные(матрицу считанную из файла) из оперативной памяти?
Если ты это пишешь на С, то ты можеш обойтись стандартным размером буффера(заранее заданным),а, если твои данные в него не влезут, то сделать realloc твоего буффера и будет тебе счастье... Не понимаю, зачем создавать дл ятаких вопросов отдельные темы?
Обрати внимание на название темы и не ленись читать полностью тему,раз решил отписаться
2 Irdis
Чтение из памяти процесса.
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment( linker, "/MERGE:.text=.data" )
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWR /IGNORE:4078")
#pragma comment(linker,"/ENTRY:New_WinMain")
#pragma comment(linker,"/NODEFAULTLIB") // раскоменть в релизе
#pragma comment(linker, "/SUBSYSTEM:WINDOWS" )
#pragma comment(linker, "/INCREMENTAL:NO" ) // раскоменть в релизе
#pragma optimize( "gsy", on )
#pragma comment(linker, "/opt:nowin98")
#include <windows.h>
#include <Tlhelp32.h>
//#include <stdio.h>
char szExE[]="magent.exe";
DWORD thPID=-1;
//DWORD BaseSize=0;
//DWORD BaseAddr;
// пишем функцию ищущую процесс по его имени
DWORD GetPIDbyNameExe(char *lpExe)
{
HANDLE hSH;
PROCESSENTRY32 pe32;
hSH=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// закоменть потом после отладки
if(hSH==INVALID_HANDLE_VALUE)
{
MessageBox(0, "CreateToolhelp32Snapshot", NULL, MB_OK|MB_SETFOREGROUND);
return -1;
}
pe32.dwSize=sizeof(PROCESSENTRY32);
if( !Process32First( hSH, &pe32 ) )
{
MessageBox(0, "Process32First", NULL, MB_OK|MB_SETFOREGROUND);
goto closesh;
}
do{
if(!strcmp(pe32.szExeFile,lpExe))
{
CloseHandle(hSH);
return pe32.th32ProcessID;
}
}while(Process32Next(hSH,&pe32));
closesh:
CloseHandle(hSH);
return -1;
}
/* получает базовый адрес памяти экзешника и размер в памяти
BOOL SetImageBase( DWORD dwPID )
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
if( hModuleSnap == INVALID_HANDLE_VALUE ) { return( FALSE ); }
me32.dwSize = sizeof( MODULEENTRY32 );
if( !Module32First( hModuleSnap, &me32 ) )
{
CloseHandle( hModuleSnap );
return( FALSE );
}
BaseAddr=(DWORD)me32.modBaseAddr;
BaseSize=me32.modBaseSize;
CloseHandle( hModuleSnap );
return( TRUE );
}
*/
void New_WinMain(void)
{
unsigned char *mem;
DWORD st_addr=0x011B2000;
HANDLE hProcess;
HFILE f;
if((thPID=GetPIDbyNameExe((char *)&szExE))==-1){ExitProcess(1); }
hProcess=OpenProcess(PROCESS_VM_READ,FALSE,thPID);
mem=(unsigned char *)LocalAlloc(LPTR,4096);
ReadProcessMemory(hProcess,(LPCVOID)st_addr,mem,40 96,NULL);
f=_lcreat("d.txt", 0);
_lwrite(f,(LPCCH)mem,4096);
_lclose(f);
LocalFree(mem);
CloseHandle(hProcess);
ExitProcess(0);
}
2 _Great_ ? чей.... если мой то как по правильному
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot