Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Чтения одного бита из файла

1.8K
21 декабря 2003 года
DEMON_HUNTER
79 / / 20.10.2003
Нужно прочитать один бит из ексе.И инвертировать его.И записать в другой файл.
6.0K
22 декабря 2003 года
fadd
6 / / 09.12.2003
Цитата:
Originally posted by DEMON_HUNTER
Нужно прочитать один бит из ексе.И инвертировать его.И записать в другой файл.


Или я вопроса не понял, или...
fopen(), fgetch(), потом ксоришь по маске и fputc(). Или я чего-то не понял.

1.8K
23 декабря 2003 года
DEMON_HUNTER
79 / / 20.10.2003
А исходничек не напишете?
4.8K
23 декабря 2003 года
Владислав
19 / / 28.09.2003
Цитата:
Originally posted by DEMON_HUNTER
А исходничек не напишете?



Код:
/*
  Вход - 1. номер бита от 0, т.е. 0 - это первый бит в массиве. 2. Путь к файлу source. 3. Путь к файлу destination.
  Выход - 0 - успех, -1 - номер бита больше чем размер первого или второго файла, код ошибки.
*/

DWORD ExchangeBit (DWORD numBit, TCHAR* FileNameS, TCHAR* FileNameD)
{
    HANDLE h = NULL;
    DWORD ret = 1;

    assert (FileNameS);
    assert (*FileNameS != TEXT('\0'));
    assert (FileNameD);
    assert (*FileNameD != TEXT('\0'));

    __try
    {
        // 1 step
        if ((h = ::CreateFile (FileNameS, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
            __leave;
       
        DWORD size = 0;
        DWORD byte = numBit / 8;
        DWORD numInByte = 7 - numBit % 8;

        if ((size = ::GetFileSize (h, NULL)) == INVALID_FILE_SIZE)
            __leave;
        if (byte >= size)
        {
            assert (0);
            ret = -1;
            __leave;
        }
        if (::SetFilePointer (h, byte, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
            __leave;

        BYTE buf = 0;
        if (!::ReadFile (h, &buf, 1, &size, NULL))
            __leave;

        buf ^= (1 << numInByte);

        ::CloseHandle (h);
        h = NULL;

        // 2 step
        if ((h = ::CreateFile (FileNameD, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
            __leave;

        if ((size = ::GetFileSize (h, NULL)) == INVALID_FILE_SIZE)
            __leave;
        if (byte >= size)
        {
            assert (0);
            ret = -1;
            __leave;
        }
        if (::SetFilePointer (h, byte, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
            __leave;

        if (!::WriteFile (h, &buf, 1, &size, NULL))
            __leave;

        ret = 0;
    }
    __finally
    {
        if (ret && ret != -1)
            ret = ::GetLastError ();
        if (h)
            ::CloseHandle (h);
    }
    return ret;
}
1.8K
24 декабря 2003 года
DEMON_HUNTER
79 / / 20.10.2003
Уй как всё сложно!!!:(
А на чистом си можете?
Не на с++.
4.8K
25 декабря 2003 года
Владислав
19 / / 28.09.2003
Цитата:
Originally posted by DEMON_HUNTER
Уй как всё сложно!!!:(
А на чистом си можете?
Не на с++.



Это и был С, только использовал я WinApi, но можно и с использованием только ANSI C.

Код:
#include <stdio.h>
#include <assert.h>
#include <errno.h>

unsigned int ExchangeBitCRT (unsigned int numBit, char* FileNameS, char* FileNameD)
{
    FILE* h;
    unsigned int size = 0;
    unsigned int byte = numBit / 8;
    unsigned int numInByte = 7 - numBit % 8;
    char buf = 0;

    assert (FileNameS);
    assert (*FileNameS != 0);
    assert (FileNameD);
    assert (*FileNameD != 0);

    // Step 1
    if (!(h = fopen (FileNameS, "rb")))
        return errno;
    if (fseek (h, byte, SEEK_SET))
    {
        fclose (h);
        return errno;
    }
    buf = fgetc (h);
    buf ^= (1 << numInByte);
   
    fclose (h);

    // Step 2
    if (!(h = fopen (FileNameD, "r+b")))
        return errno;
    if (fseek (h, byte, SEEK_SET))
    {
        fclose (h);
        return errno;
    }
    fputc (buf, h);
    fclose (h);
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог