C не может прочитать файл - PullRequest
0 голосов
/ 24 марта 2020

У меня есть домашняя работа по расшифровке секретного сообщения из файла. Мне нужно прочитать файл и преобразовать символы для расшифровки, но я даже не смог запустить функцию decrypt_and_print (char *). Чтобы проверить это, я поставил строку управления, но когда я запускаю код, он ничего не пишет и не заканчивает процесс. Я не знаю, почему это происходит, я новичок в c. Вот мой код:

#include <stdio.h>
void decrypt_and_print(char*);
int main(){
        char* file_name = "/home/baran/hw4/encrypted_p1.img";
        decrypt_and_print(file_name);
        return 0;
}
void decrypt_and_print(char* file_name){
        FILE *f = fopen(file_name,"r");
        if(f == NULL){
                printf("Couldn't open file!");
        }else{
                printf("File opened sucesfully!");
        }
        char a;
        fscanf(f,"%ch",&a);
        while(fscanf(f,"%ch",&a) == 1){
                switch(a){
                        case '0':{printf(" ");break;}
                        case '1':{printf("-");break;}
                        case '2':{printf("_");break;}
                        case '3':{printf("|");break;}
                        case '4':{printf("/");break;}
                        case '5':{printf("\\");break;}
                        case '6':{printf("O");break;}
                        default:printf("\n");
                }
        }
}

1 Ответ

0 голосов
/ 25 марта 2020

следующий предложенный код:

  1. безупречная компиляция
  2. использует допустимую строку формата при вызове, чтобы fscanf()
  3. выполняла желаемую функциональность
  4. информирует пользователя через stderr, когда не удается открыть файл
  5. завершает строки формата в `printf () с '\ n', чтобы каждый символ находился на новой строке
  6. печатает значение цифры c любых символов, еще не обработанных в операторе switch().
  7. следует аксиоме: только один оператор на строку и (самое большее) одно объявление переменной на оператор.
  8. документирует, почему заголовочный файл stdlib.h включается
  9. должным образом завершается при сбое вызова fopen() вместо попытки чтения из (неоткрытого) файла

и теперь предложенный код:

#include <stdio.h>
#include <stdlib.h>   // exit(), EXIT_FAILURE

void decrypt_and_print(char*);

int main( void )
{
        char* file_name = "/home/baran/hw4/encrypted_p1.img";
        decrypt_and_print( file_name );
        return 0;
}


void decrypt_and_print( char* file_name )
{
    FILE *fp = fopen( file_name, "rb" );
    if( !fp )
    {
         perror( "fopen faiied" );
         exit( EXIT_FAILURE );
    }

    printf("File opened successfully!");

    char a;

    while( fscanf(fp, "%c", &a ) == 1 )
    {
        switch( a )
        {
            case '0': 
                printf( " \n" );
                break;

            case '1':
                printf( "-\n" );
                break;

            case '2':
                printf( "_\n" );
                break;

            case '3':
                printf( "|\n" );
                break;

            case '4':
                printf( "/\n" );
                break;

            case '5':
                printf( "\\\n" );
                break;

            case '6':
                printf( "O\n" );
                break;

            default:
                printf( "char: %d ignored\n", (int)a );
                break;
        }
    }
}

предлагает изменить его так, чтобы он ожидал параметр командной строки с путем / именем файла, а не в зависимости от жестко заданного пути / имени

Предложить заменить

int main( void )
{
    char* file_name = "/home/baran/hw4/encrypted_p1.img";

на

int main( int argc, char* argv[] )
{
    char *file_name;
    if( argc < 2 )
    {
        file_name = "/home/baran/hw4/encrypted_p1.img";
    }
    else
    {
        file_name = argv[1];
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...