Почему в цикле функция fwrite() корректно не работает? Если записать информацию в файл одним блоком, то все нормально?
Изучая бинарные операции пытался "шифровать" информацию в файле. Не могу понять почему в цикле не получается записать по байтно информацию в файл использую fwrite(). Если все данные записать разом одним блоком, то все гуд. При изучении этого вопроса в коде есть повторяющиеся блоки для контроля внутреннего указателя в файле. При выполнении отладки в пошаговом режиме программа корректно отрабатывает.
Ссылка на проект codeblocks https://drive.google.com/drive/folders/1ZikyrwI2-5BWkIfuEjdMXSgNk6efwxGH?usp=sharing
Сам код. Файл binary.h и текстовый файл original.txt есть в проекте на Drive Google. Программа побайтно меняет данные в файле в соответствии с заданной маской и записывает обратно
#include <stdio.h>
#include <stdlib.h>
#include "binary.h" // !!!!!!
#include <conio.h>
#include <ctype.h>
#include <windows.h>
char chr; // шифруемый символ
char chr_secret; // зашифрованный символ
char mask = b01010101; // Маска для шифрования при помощи ^
// Шифрование
void coding(void)
{
FILE * f_original;
f_original = fopen("original.txt", "rb+");
fseek(f_original, 0, SEEK_END);
long flenght = ftell(f_original);
fseek(f_original, 0, SEEK_SET);
// Было так
/*char * pchr;
pchr = (char *) malloc(flenght * sizeof(int));
int i = 0;
while(fread(&chr, sizeof(chr), 1, f_original))
{
chr_secret = chr ^ mask;
chr_secret = ~chr_secret;
pchr[i++] = chr_secret;
}
fclose(f_original); f_original = fopen("original.txt", "wb+");
fwrite(pchr, flenght, 1, f_original); // сразу записал строку целиком
free(pchr); fclose(f_original);*/
long my_long;
while(fread(&chr, sizeof(chr), 1, f_original))
{
chr_secret = chr ^ mask;
chr_secret = ~chr_secret;
//одинаковые блоки. Использовал для просмотра внутреннего указателя
/*{
my_long = ftell(f_original);
printf("%lu", my_long);
fseek(f_original, 0, SEEK_END);
printf("%lu", ftell(f_original));
fseek(f_original, my_long, SEEK_SET);
my_long = ftell(f_original);
printf("%lu", my_long);
}*/
fseek(f_original, -1, SEEK_CUR);
/*{
my_long = ftell(f_original);
printf("%lu", my_long);
fseek(f_original, 0, SEEK_END);
printf("%lu", ftell(f_original));
fseek(f_original, my_long, SEEK_SET);
my_long = ftell(f_original);
printf("%lu", my_long);
}*/
fwrite(&chr_secret, sizeof(char), 1, f_original);
// как только комментируешь последний блок программа уходит в ошибку
// как будто процессор работает быстрее, запись в файл еще не успела произойти
{
my_long = ftell(f_original);
printf("%lu", my_long);
fseek(f_original, 0, SEEK_END);
printf("%lu", ftell(f_original));
fseek(f_original, my_long, SEEK_SET);
my_long = ftell(f_original);
printf("%lu", my_long);
}
}
fclose(f_original);
}
int main()
{
coding();
return 0;
}
Ответы (1 шт):
Добавьте сброс на диск fflush(f_original);:
while(fread(&chr, sizeof(chr), 1, f_original))
{
chr_secret = chr ^ mask;
chr_secret = ~chr_secret;
fseek(f_original, -1, SEEK_CUR);
fwrite(&chr_secret, sizeof(char), 1, f_original);
fflush(f_original);
}
fclose(f_original);
Так работает?
Но так будет явно медленнее, чем работать с блоками.