Nano Hash - криптовалюты, майнинг, программирование

Как я могу одновременно читать и писать в двоичный файл?

Я хочу изменить значение пары байтов в большом двоичном файле с помощью команды MATLAB fwrite. То, что я пытаюсь сделать, это открыть файл, используя:

fopen(filename,'r+',precision);

Затем прочитайте файл, используя:

fread(fid,NUM,'int32');

Это все работает. Как только я доберусь до позиции файла, где я хочу записать (перезаписать) значения следующих байтов, я использую команду:

fwrite(fid,variable_name,'int32');

Затем я закрываю файл:

fclose(fid);

Затем я возвращаюсь и перечитываю файл, и эти байты не изменились!

Так это невозможно? Или 'r+' нельзя использовать?


  • Пожалуйста, покажите свой код, чтобы нам было легче воспроизвести. 09.06.2009

Ответы:


1

Из документации для fopen:

Для чтения и записи в один и тот же файл:

  • Откройте файл со значением permission, которое включает знак плюс, '+'.
  • Вызывайте fseek или frewind между операциями чтения и записи. Например, не вызывайте fread, за которым следует fwrite, или fwrite, за которым следует fread, если вы не вызываете fseek или frewind между ними.

Короче говоря, вам нужно вызвать fseek перед вызовом fwrite:

fid = fopen(filename, 'r+', precision);
data = fread(fid, NUM, 'int32');
fseek(fid, 0, 'cof');
fwrite(fid, variable_name, 'int32');
fclose(fid);

На самом деле, если вам на самом деле не нужно ничего читать из файла, а просто нужно перейти в заданную позицию в файле, я бы просто использовал fseek вместо вашего вызова fread. Например:

fid = fopen(filename, 'r+', precision);
fseek(fid, NUM*4, 'bof');
fwrite(fid, variable_name, 'int32');
fclose(fid);
08.06.2009

2

Когда вы читаете, чтобы узнать, какой байт нужно изменить, подсчитайте, сколько байтов вам нужно пропустить (например, по 4 байта для каждого типа int или float).

bytesToSkip = 0;
not_the_value_you_want = true;
bytesPerValue = 4; %for a float or int

while not_the_value_you_want

...some code here...

  if 'this is it'

  not_the_value_you_want = false; % adapt this to your taste

  else

  bytesToSkip += bytesPerValue;

  end;

...maybe more code here...

end;

Попробуйте это после:

fileID = fopen('YourFile.bin','w+');
fseek(fileID,bytesToSkip,'bof'); %'bof' stands for beginning of file
fwrite(fileID,newValue);
fclose(fileID);
10.04.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..