Изменить байт в бинарном файле

Тема в разделе "Общие вопросы по С и С++", создана пользователем byte255, 23 дек 2010.

  1. byte255

    byte255 Гость

    Здравствуйте. Подскажите пожалуйста, мне нужно изменить байт в бинарном файле, для чего использую такой код
    Код (C++):
    void BinFile::writeByte(long pos, short byte)
    {
    ofstream bin(this->filename, ios_base::binary);
    bin.seekp(pos,ios_base::beg);
    bin.put(byte);
    bin.close();
    }
    Байт исправно записывается, но прочие байты файла устанавливаются в 0.
    Компилятор g++, система linux ubuntu 9.10.
     
  2. ierofant

    ierofant Гость

    put для файловых потоков не очень годится.

    Вот так в моём файле я сделал замену для третьего символа.
    Код (C++):
            std::ifstream in ("file", std::ios::binary);
    in.seekg (0, std::ios::end);
    int size = in.tellg ();
    char mas [size];

    in.seekg (0, std::ios::beg);
    in.read (mas, sizeof mas);
    in.close ();

    mas [3] = 0x33;

    std::ofstream out ("file", std::ios::binary | std::ios::trunc);
    out.write (mas, sizeof mas);
    out.close ();
    Добавлено: Чуть не обманул вас, можно вот так:
    Код (C++):
        char sym = 0x33;
    std::ofstream out ("file", std::ios::binary);
    out.seekp (3, std::ios::beg);
    out.write (&sym, sizeof sym);
    out.close ();
     
  3. byte255

    byte255 Гость

    Спасибо!!!
    К сожалению, в линуксе не отработало... те же нули вместо всех остальных байтов. Приду домой, в виндовс попробую.
    В какой среде ваш код отработал?
     
  4. Гость

    Попробуйте так:
    Код (C++):
    void BinFile::writeByte (long pos, short byte)
    {
    ofstream bin (this->filename, ios_base::binary | ios_base::ate);
    bin.seekp (pos, ios_base::beg);
    bin.put (byte);
    bin.close ();
    }
    То есть всё то же самое, только в открытии файла надо указать параметр ate.
    Если не поможет, то больше у меня нет идей.
     
  5. byte255

    byte255 Гость

    Не помогло (
    Тот же вопрос, если не трудно, чем компилировали?
     
  6. ierofant

    ierofant Гость

    Мой код работает на ubuntu-10.04. Компилятор gcc. Но это по идее не должно зависеть от компилятора и операционки. Это же стандартные функции С++.

    Добавлено: Попробуйте так.

    Код (C++):
    void BinFile::writeByte(long pos, char byte)
    {
    std::ofstream bin(this->filename, std::ios::binary);
    bin.seekp (pos, std::ios::beg);
    bin.write (&byte, sizeof byte);
    bin.close();
    }
     
  7. ierofant

    ierofant Гость

    А ещё мне интересно, зачем вы пишите this->filename, а не просто filename?
     
  8. byte255

    byte255 Гость

    У меня ubuntu 9.10. На всякий случай просто скопировал ваш код, но результат тот же. Правда я g++ использую, сейчас попробую gcc (
    до сих пор думал, что им программы на C (но не С++) компилируются).
     
  9. ierofant

    ierofant Гость

    Дело в том, что g++ это расширение gcc, для c++. Я компилю тоже через g++. Просто сам компилятор правильнее называть gcc.
     
  10. byte255

    byte255 Гость

    Учту, спасибо за помощь. Однако,в чем же может дело быть...
    Код (C++):
    int main()
    {
    BinFile f("./main.o");
    f.writeByte(10, 'n'); //в определении writeByte() - абсолютная копия вашей функции
    return 0;
    }
    Команда для компиляции:
    Код (Text):
    #!/bin/bash
    gcc -c binfile.cpp main.cpp
    g++ -Xlinker binfile.o main.o -o testwriter
    или
    Код (Text):
    g++ binfile.cpp main.cpp -o testwriter
    В результате размер файла main.o становится 10 байт, в последнем 0x6E
     
  11. ierofant

    ierofant Гость

    Делай тогда, через чтение, а потом запись. Смотри самый-самый первый пример у меня.
     
  12. ierofant

    ierofant Гость

    Как-то так.

    Код (C++):
    void write_byte (long _pos, char _sym)
    {
    std::ifstream in (filename, std::ios::binary);
    in.seekg (0, std::ios::end);
    int size = in.tellg ();

    char mass [size];
    in.seekg (0, std::ios::beg);
    in.read (mass, sizeof mass);

    mass [_pos] = _sym;

    std::ofstream out (filename, std::ios::binary | std::ios::trunc);
    out.write (mass, sizeof mass);
    out.close ();
    }
     
  13. byte255

    byte255 Гость

    Да, а если в файле более гигабайта? Копировать в память?
    вот истина =)
    Код (C++):
     void BinFile::writeByte(long pos, char byte)
    {
    ofstream bin(this->filename, ios_base::in|ios_base::binary);
    bin.seekp(pos,ios_base::beg);
    bin.put(byte);
    bin.close();
    }
     
Загрузка...

Поделиться этой страницей