C программирование читает несколько строк и делает паузу до нажатия любой клавиши на клавиатуре - PullRequest
1 голос
/ 16 мая 2019

Я очень новичок в программировании на Си.Я надеюсь, что смогу объяснить мою проблему.Я пытаюсь разработать программу для чтения файла binary и преобразования в режим ASCII.Для этого не было никаких проблем.Но я должен спросить пользователя, сколько строк он / она хочет прочитать (например, 20 строк), затем показать только 20 строк из двоичного файла и попросить пользователя нажать любую клавишу для продолжения.После нажатия любой клавиши снова отобразите следующие 20 строк из этого файла и так далее.

Я пытался использовать getch() и getchar(), но это работало только для одной строки.

Мой следующий код может помочь объяснить правильно.Пожалуйста, помогите мне от этого.Заранее спасибо.

#include<conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void header(); //Title function declaration

int main(int argc, char *argv[])
{
    FILE *fp; // File pointer declaration
    int i, j;
    unsigned char buffer[17]; // Trying to get value for 16 bites each

    fp = fopen(argv[1], "rb"); 
    if (argc == 1) { // Condition for if user didnt specify file name
        /* Assume that argv[0] is the program name */
        printf("usage: %s, <file_name>", argv[0]);
        return 0;
    }

    if (fp == NULL) { // condition if there is no file 
        fprintf(stderr, "File Open error (%s) , error = %d", argv[1], errno);
        exit(1);
    }

    else
    {
        header(); // Calling function header

        int read = 0;
        int address = 0;
        while ((read = fread(buffer, 1, 16, fp)) > 0)
        {
            printf("%08X", address); 
            printf(" ");
            address += 16;

            for (i = 0; i < read; i++)
            {
                if (i == 8) {
                    if (buffer[i] != NULL)
                        printf("-");
                }
                else {

                    printf(" ");
                }
                printf("%02X", buffer[i]);
            }

            int space = 16 - read;

            if (space != 0) {

                for (int x = 0; x < space; x++) {
                    int y = read + (x - buffer[x]);
                    printf("   ");
                }
            }
            printf("  ");
            for (j = 0; j < read; j++)
            {
                if (buffer[j] == NULL) {
                    printf(".");
                }
                if (isprint(buffer[j])) {
                    printf("%c", buffer[j]);
                    //fflush(stdin);
                }
                else {
                    if (buffer[j] != NULL) {
                        printf(".");
                    }
                }
            }
            printf("\n");

        }

    }
    fclose(fp);

    return 0;
}

void header() {
    printf("ADDRESS  ");

    for (int i = 0X00; i <= 0X0F; i++)
    {
        if (i == 8) {
            printf("-");
        }
        else
        {
            printf(" ");
        }
        printf("%02X", i);
    }
    printf("  0123456789ABCDEF \n");
    printf("----------------------------------------------------------------------------\n");

}

И вывод должен быть как Образец

1 Ответ

1 голос
/ 16 мая 2019

Вам необходимо окружить логику чтения и печати внутри циклов.

int read = 0;
int address = 0;
int numLines = 0;

printf("How many lines you want to print?");
scanf("%d", &numLines);
do {

       for(int i = 0; i<numLines; i++)
       {
                if ((read = fread(buffer, 1, 16, fp)) > 0)
                {
                      ....... //your printing logic here
                }
       }

       /*Flush input stream in case \n left out*/
       int c;
       while ((c = getchar()) != '\n' && c != EOF) { }

       printf("press Any key to continue\n");
       getchar();
 } while(read>0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...