Последующая операция чтения и записи в файлах с C ++ - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть двоичный файл (test.bin), в котором есть 2 целых числа без знака соответственно 1000 и 4000.С помощью приведенного ниже кода я хочу изменить первое число на 5000 с первой функцией записи, а затем я хочу прочитать второе число и переписать его с 4000-2000 = 2000. Тем не менее, программа меняет 1000 на 5000, но это не меняет4000 до 2000. Даже если я использую file.flush () или file.sync (), это не имеет никакого эффекта.Интересно, что когда я ставлю file.tellg () или file.tellp (), он работает так, как я хочу.(Я выяснил это по стечению обстоятельств) Это происходит как в Linux, так и в Windows.В Linux я пытаюсь скомпилировать его с помощью g ++.sizeof (unsigned int) = 4, и я уверен, что программа может открыть test.bin.

#include <fstream>
#include <iostream>

using namespace std;

int main(){
    fstream file;
    unsigned int data, buffer;
    data=5000;
    file.open("test.bin", ios::binary | ios::in | ios::out);

    file.write((char*)&data,4); // will change first number to 5000

    // file.flush();  // Nothing changes if I delete comment signs.

    // file.tellp();  // Program works correctly if I uncomment this. 
    // file.tellg();  // Program works correctly if I uncomment this.

    file.read((char*)&buffer, 4);  // position pointer should be at the beginning of the 2nd number

    file.seekp(-4, ios::cur); // Since internal pointer is at the end of the file after the read(), I manually put it back to the beginning of the 2nd number.

    buffer-=2000;
    file.write((char*)&buffer,4); // Now, it should rewrite 2nd number with 2000. 

    file.close();
    return 0;
}

1 Ответ

2 голосов
/ 28 ноября 2011

Бинго! Вы наткнулись на очень неясное, почти неписанное и в лучшем случае неоднозначное требование языка C ++. Я пытался утверждать, что удалил его из G ++, и написал для этого патч , но встретил откровенный ответ от сопровождающих , который был принят после того, как я показал, что это можно сделать без тяжелый редизайн.

Если память служит, спецификация C ++ упоминает, что файловые потоки работают с той же семантикой, что и потоки C <stdio.h>, а спецификация C говорит, что вы должны seek между чтением и записью в один и тот же файл.

Вот ошибка: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45708

Дискуссия № 1: http://gcc.gnu.org/ml/libstdc++/2010-09/msg00079.html

Дискуссия № 2: http://gcc.gnu.org/ml/libstdc++/2010-09/msg00104.html

РЕДАКТИРОВАТЬ : Мне нужна лучшая память! Фактически, было совершено 22 сентября 2010 года в GCC 4.6.0. Оставшиеся правки, которые не были зафиксированы, касались изменения фасета codecvt локали во время ввода-вывода.

Ошибка отслеживания принятых изменений: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45628

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...