nixp.ru v3.0

21 октября 2017,
суббота,
02:26:55 MSK

DevOps с компанией «Флант»
anonymous написал 17 апреля 2005 года в 21:30 (422 просмотра) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

У меня задача изменить случайные байты в файле с заданной вероятностью. Сейчас я читаю и перезаписываю каждый байт в не зависимости от того, меняю я его или нет. Может быть можно сделать так, чтобы переписывать только изменяемый байт? Вот моя прога:

#include

#include

long MODMULT (long a,long b,long m, long s) { //линейный конгруэнтный генератор

s=(a*s +b)%m;

return s;

}

int numberbit[8]={1,2,4,8,16,32,64,128}; //номер изменяемого бита в байте

int main(int argc, char *argv[])

{

unsigned char c;

long a=2311;

long b=25367;

long m=120050;

long s= 235;

long d,g;

float e;

if (argc!=2) {

cout<<» Применение: имя_программы имя_файла\n»;

return 1;

}

fstream f(argv[1],ios::in | ios::out | ios::binary);

if(!f) {

cout<<"Не удалось открыть файл.\n»;

return 1;

}

cout<<"Введите вероятность ошибки:» ;

cin>>e;

d=m*e;

while(!f.eof()){

c=f.get();

g=MODMULT(a,b,m,s);

if (g

long l=MODMULT(a,b,m,s);

if(0 <= l < m/8) c^=numberbit[0];

if(m/8 <= l < m/4) c^=numberbit[1];

if(m/4 <= l < 3*m/8) c^=numberbit[2];

if(3*m/8 <= l < m/2) c^=numberbit[3];

if(m/2 <= l < 5*m/8) c^=numberbit[4];

if(5*m/8 <= l < 3*m/4) c^=numberbit[5];

if(3*m/4 <= l < 7*m/8) c^=numberbit[6];

if(7*m/8 <= l <= m) c^=numberbit[7];

}

f.put(c);

}

f.close();

return 0;

iliya

Открываешь файл для чтения+записи, переходишь на нужный байт, считываешь, пишишь, закрываешь файл, готово.

см. man open(), write(), read(), lseek(), close().