处理文件时出现错误的文件描述符错误

Bad file descriptor error by working on files

C。 处理文件时出现错误的文件描述符错误。 这是大学的作业。我需要压缩文件 txt 然后解压缩它。压缩方法工作正常 它通过最后一个二进制数字 (Msb) 在任何 ASCII 字符中始终为零的想法进行压缩。 有人知道为什么会这样吗? 当我在解压缩方法中执行 fgetc(input_file_8to7) 时会出现问题 主要问题是我在未压缩方法中从 2 fgetc(input_file_8to7) 得到 -1

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#include <stdlib.h> 
#include <stdint.h> 

解压缩的输入是压缩的输出,输入是包含接下来两行的txt文件: 十六进制转储是计算机数据的十六进制视图,来自内存或计算机文件。

***compres method***

    void compress8to7(FILE *input,FILE* output8to7)
    {
        // 0x00 87 00 87 00 87 00 87 ll
        uint64_t magic=0x87008700870087ll;
        uint64_t inputsize=0;
    
        fwrite(&magic,sizeof (magic),1,output8to7);
        fwrite(&inputsize,sizeof(inputsize),1,output8to7);
        unsigned char  st;
        unsigned char st2;
        char check;
        char check2;
        char shift=7;
        char shift_st=0;
        unsigned char inbfile;

// will contain the resullt of the asked new binary lines comprees

        int breakflag=0;
        int breakflag2=0;
        int cnt=-1;

//this parameter will help to know when we dont need to move 1 back in the pointer of input file

        while(1) {
    
            cnt++;
            if (ftell(input)>1 && cnt%7!=0) //
            {
                fseek(input,-1 ,SEEK_CUR) ;
            }
    
            check = fgetc(input);
            st=check;
            if(check2==EOF){breakflag2=1;}
    
            check2 = fgetc(input); 

> //if the length  is odd number check2 will get the eof

            st2=check2;
            if(check==EOF){breakflag=1;}
    
            st2=st2<<shift; 

> //move the digit to the right position

bit manipulation

            st=st>>shift_st;
            shift_st++;
            if(shift_st==7)
            {shift_st=0;}
    
            shift=shift-1;
            if(shift==0)
                shift=7;
    
            if(breakflag2!=1)
                {inbfile=st2|st;
                }else{ inbfile=st; }
            fwrite(&inbfile, sizeof(inbfile),1,output8to7);

write to the file

            if(feof(input))
            {
                inputsize= ftell(input);
           
                fseek(output8to7,8,SEEK_SET);
                fwrite(&inputsize,sizeof (inputsize),1,output8to7);
               // if(breakflag==1)
                break;}
    
        }
    
    }
*** uncompress method***

问题出在这个方法

void uncompress8to7 (FILE *input_file_8to7  ,FILE *output_file_txt){
     char st;
     char st2;
    char check;
    char check2;
    char shift2 = 7;
    char shift_st = 0;
    char shift_helper=7;
    char shift_helper2=6;
    char sthelper;
    char sthelper2;
    char inbfile; // will contain the resullt of the asked new  binary lines comprees
    int breakflag = 0;
    int breakflag2 = 0;
    int cnt = -1;//this parameter will help to know when we dont need to move 1 back in the pointer of input file
    rewind(input_file_8to7);

    printf("%d",ftell(input_file_8to7));
    fseek(input_file_8to7,16,SEEK_SET);
    printf("\n%d",ftell(input_file_8to7));
    int a=0;
    while(1) {
    cnt++;

    if(cnt>1) //
        {fseek(input_file_8to7,-1 ,SEEK_CUR);}
    printf("\n%d",ftell(input_file_8to7));

from that fgetc i get the bad file descriptor erorr

    check =  fgetc(input_file_8to7);


    if(ferror(input_file_8to7)){
        perror("eror by perror");
        printf("file erorr");}

  //  printf("\n%d",ftell(input_file_8to7));

    st = check;
    check2 = fgetc(input_file_8to7);
    st2 = check2;

    if(cnt<2)
        fseek(input_file_8to7,0,SEEK_SET);

    if(check2==EOF){
    breakflag2 = 1;
    }

    sthelper2=st2;
    sthelper2=sthelper2>>shift_helper2;

    st2=st2<<shift2;
    st2=st2>>shift2;

    sthelper=st;
    sthelper=sthelper>>shift_helper;
    sthelper=shift_helper<<shift_helper-1;
    st=st<<shift_st;// to make all zero after the msb
    st=st>>shift_st;// to make all zero after the msb


    shift_helper2--;
    if(shift_helper==-1)
        {shift_helper2=6;}

    shift_helper--;
    if(shift_helper==-1){
        shift_helper=7;
    }

    shift_st++;
    if(shift_st==7)
        {shift_st=0;}

    shift2=shift2-1;
    if(shift2==0)
        shift2=7;

    if(breakflag2==1)
        {break;}
    if(cnt%7==0){
        inbfile=st;
    }else{
        inbfile=sthelper|st2;
    }

writing to the file

    fwrite(&inbfile,sizeof(inbfile),1,output_file_txt);

break the loop when we got to the end of file

    if(feof(input_file_8to7))
         { break;}

    }
}


***main***

int main(int argc, char **argv) {
    char* input=NULL;
    char* output8to7=NULL;
    input=argv[1];
    output8to7=argv[2];

open files

    FILE* inputfile = fopen(input, "r");
    if(inputfile==NULL)
    {
        printf("couldnt open input file ");
        exit(-1);
    }

    FILE* file8to7=fopen(output8to7, "wb");
    if(file8to7==NULL)
    {
        printf("couldnt open output file");
        printf(output8to7);
        exit(-1);
    }

compress

    compress8to7(inputfile,file8to7);

    FILE* file8to7input=fopen("exampleout.bin", "ab");

    FILE* output_file=fopen("UNoutput_file2.txt", "wb");
    if(output_file==NULL)
    {printf("couldnt open output file");
        exit(-1);
    }

    uncompress8to7(file8to7input,output_file);
   fclose(output_file);
    fclose(file8to7input);
    fclose(inputfile);
    fclose(file8to7);
    return 0;
}

这是打开文件的代码:

    FILE* file8to7input=fopen("exampleout.bin", "ab");

这将以追加模式将其作为输出文件打开。您正在尝试在 uncompress8to7() 函数中读取它。您需要在读取模式下将其作为输入文件打开。将该行更改为:

    FILE* file8to7input=fopen("exampleout.bin", "rb");