Вообщем я знаю, что ответ на msdn, но времени нет, а пользуюсь я им крайне медленно, поэтому и прошу помощи здеся! Есть файл конфигурации ... нечитаемый в блокноте ... во FlexHex я заметил, что меняется только один байт по адресу 00-00-02-3Е, да это и не важно наверное ... вообщем мне нужно на билдере написать прогу, которая откроет этот файл, найдёт этот байт, изменит его и сохранит ... что за функции мне нужны ??? ну или рабочий кусочек - это вообще шоколадно ))) Всем заранее спасибо!
кактотак Код (Text): int _tmain(int argc, _TCHAR* argv[]) { FILE *stream; if( (stream = fopen( "file.txt", "r+" )) == NULL ) { printf( "Error: The file was not opened\n"); return 0; } fseek(stream, 0x23e, SEEK_SET); char X=0; fwrite((void*)&X,1,1,stream); fclose(stream); return 0; }
или так Код (Text): HANDLE hFile = CreateFile( "somefile.exe", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 ); if ( hFile != INVALID_HANDLE_VALUE ) { szDw = 0; SetFilePointer( hFile, 1588, NULL, 0 ); //1588 смещение в int WriteFile( hFile, server, lstrlen( server ), &szDw, NULL ); szDw = 0; if ( lstrlen( server ) < 30 ) { WriteFile( hFile, zero, 1, &szDw, NULL ); } }
Freeman Два вопросика ))) 0x23 - это как я понимаю адрес, но как он пересчитывается ? 00 00 0E 3B - это то, что мне надо, что получится... 0х3643 ??? (void*) - это ещё зачем ???
Да и ещё сложность для меня в том, что я знаю как отредактировать этот файл во FlexHex, а не в блокноте... в то время как fread возвращает значение как в блокноте
BadLogin fwrite первым параметром принимает указатель на буфер, куда осуществлять чтение. у тебя в кач-ве буфера выступает char X (т.е. НЕ указатель); потому и эти приседания. попробуй кстати: Код (Text): if( (stream = fopen( "file.txt", "rb+" )) == NULL ) //...
что это ?? и, кстати, что на счёт 0х23е - я как то не очень силён ... может ссылочка какая есть, чтоб почитать (на русском желательно)
BadLogin вы о чем? в общем, прочтите хелп по ф-ции fwrite, особенно про режимы открытия ею файлов, и про ф-цию fseek.
прочитал .. написано, что это смещение ... но в каком формате оно задаётся... я не знаю что такое "long offset" и ещё мне нужно вернуть байт - 01 или 00, а я не знаю что за тип данных мне нужен (((
Код (Text): fseek (stream, 0x0E3B, SEEK_SET); char X,*Y; fread (&Y, 1, 1, stream); BinToHex(Y, &X, 1); Edit1->Text = X; при выполнении выдаёт ошибку Без конвертации выдаёт пробел, но мне то нужен байт "00" или "01"
Код (Text): char X,*Y; fread (&Y, 1, 1, stream); ты здесь пытаешься в кач-ве буфера куда писать взять адрес по которому лежит указатель (т.е. указатель на указатель на Y), а на самом деле нужен именно сам указатель по которому лежит твой буфер. и потом ,у тебя Y указывает в космос, т.к. он не инициализированный сделай так: Код (Text): char X,*Y; Y = new char[1]; fread (Y, 1, 1, stream); //blablabla... delete []Y; + по-хорошему не забудь проверить, ск-ко реально прочиталось. а ты выкидываешь результат этой ф-ции почему-то.. или же вообще хранить буффер на стеке: Код (Text): char X,Y; fread (&Y, 1, 1, stream); //blablabla...
вообщем мой труд движется небольшими шажочками, ASCII символ прочитал ... функция BinToHex возвращает старший разряд (4 из 40, ну или 0 из 01), а мне нужно изменить как раз-таки младший разряд.... кроме того Код (Text): fread работает, но даёт немного не тот результат Код (Text): fwrite ни каких изменений в файле не производит (делал резервную копию и сравнивал во Флексе - идентичны) ИТОГ: 1) как прочитать и записать байт полностью ? 2) как сохранить изменения в файле ? P.S. прошу прощения за мою бестолковость, но с чего-то нужно начинать.
Если этот байт всегда на одном и том же месте, то просто сделай меппинг файла в память и измени нужный байт по указателю, и не надо никаких фреад...
_tmp17628 Да, мэппинг как раз для этого и нужен. =) BadLogin Почему ты сначала сказал, что нужно изменить байт по адресу 00-00-02-3Е, а теперь меняешь его по адресу 00-00-0E-3B, пересчитал что ли как?