пишу программную реализацию кода AMI на языке Си. Кодирование происходит про принципу: на вход поступает последовательность символов, состоящая из нулей и единиц. Нуль всегда остаётся нулём, а единица меняется на единицу или на -единицу, взависимости от предыдущего уровня.
Необходимо написать кодер и декодер. Я использую 3 файла input.txt -исходная последовательность, output.txt - закодированная последовательность, decoded.txt - раскодированная последовательность.
Однако, в decoded появляется один лишний нуль в конце, предполагаю, что это связано с некорректной работой feof() в данной ситуации.
#include <stdio.h>
#include <conio.h>
int main(){
int srs;
int prev_unit_level = 1;
FILE inp, out;
inp = fopen("input.txt","r");
out = fopen("output.txt","w");
while(!feof(inp)){
fscanf(inp,"%d",&srs);
if(srs == 0){
fprintf(out,"%d ",srs);
}
if(srs == 1){
fprintf(out,"%d ",prev_unit_level);
prev_unit_level = - prev_unit_level;
}
}
fclose(inp);
fclose(out);
prev_unit_level = 1;
inp = fopen("output.txt","r");
out = fopen("decoded.txt","w");
while(!feof(inp)){
fscanf(inp,"%d",&srs);
if(srs == 0){
fprintf(out,"%d ",srs);
}
else{
fprintf(out,"%d ",prev_unit_level);
}
}
return 0;
}
while(!feof(inp)){- это прям классический антипаттерн. Похоже, что он растет с паскаля, где это вроде работало как нужно. Вот сейчас @Harry придет и расскажет:) – KoVadim May 10 '22 at 20:31feof()до него нельзя. Реально вам надо тут написатьwhile (fscanf(inp,"%d",&srs) == 1) { ... }(см. man fscanf) – avp May 10 '22 at 22:45