2016-10-20 1 views
1

Все, что я хочу сделать, это переместить указатель «put» из конца файла в точку «X» за конец файла.Как переместить X-байты из конца файла и отредактировать его? (Использование потока в C++)

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(){ 
    ofstream ofile; 
    //Assuming "file.dat" does not exist 
    ofile.open("file.dat", ios::binary|ios::app); 
    int x = 12; 
    ofile.write((char*) &x, sizeof(int)); 
    ofile.seekp(-4, ios::cur); 
    x = 10; 
    ofile.write((char*) &x, sizeof(int)); 
    ofile.close(); 

    x = 0; 
    ifstream ifile("file.dat", ios::binary); 
    ifile.read((char*) &x, sizeof(int)); 
    cout<<x; //This line should display 10 
    return 0; 
} 

Однако выходные дисплеи 12 ...

Image of output here ...

Я читал много статей о StackOverflow, которые действительно упоминал, что 'искать' на 'положить' указатель, я должен использовать «ios :: ate», а не «ios :: app».

Но я даже пытался использовать следующие вместо этого, и я до сих пор не везло ...

ofile.open("file.dat", ios::binary|ios::ate); 

Это то, что я делаю неправильно? Есть ли другой способ переместить указатель «put» назад как таковой?

Это только упрощенная версия того, что не работает в проекте мне нужно сделать для школы ...

Любая помощь будет оценена ... Спасибо ...

+0

Вот что 'ИОС :: app' делает - [искать до конца потока перед каждой записью] (http://en.cppreference.com/w/cpp/io/ios_base/openmode) –

ответ

0

Когда ты укажите ios::app, это означает «все писать всегда до конца, не заботьтесь о пометке.

Если вы всегда хотите начать писать в конце, но хотите также иметь возможность передвигаться, тогда вам нужно ios::ate , но если вы используете только ios::binary|ios::ate, тогда файл будет усечен. Вам нужно добавить ios::in и он будет работать.

Это будет работать, когда файл существует и будет записываться до конца, перезаписывать и читать его.

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(){ 
    ofstream ofile; 
    //Assuming "file.dat" does not exist 
    ofile.open("file.dat", ios::binary|ios::in|ios::ate); 
    int x = 12; 
    ofile.write((char*) &x, sizeof(int)); 
    ofile.seekp(-4, ios::cur); 
    x = 10; 
    ofile.write((char*) &x, sizeof(int)); 
    ofile.close(); 

    x = 0; 
    ifstream ifile("file.dat", ios::binary|ios::ate); 
    ifile.read((char*) &x, sizeof(int)); 
    ifile.seekp(-4, ios::cur); 
    cout<<x; //This line should display 10 
    return 0; 
} 
+0

I попробовал то, что вы сказали, но выход был еще 12, а не 10. :( –

+0

Он работал, когда я использовал –

+0

@VallabhRamakanth Извините, у меня было приложение там, когда ему нужно было –

Смежные вопросы