Прочитайте текстовое содержимое двоичного файла и отобразите его на стандартный вывод - PullRequest
1 голос
/ 03 апреля 2011
#include <stdio.h>
#include <stdlib.h>

typedef struct filedata
{
        char data[100];
}data_t;

data_t * fname=NULL;

//IS AN ARRAY OF the structure filedata REQUIRED HERE

void quit()
{
      printf("\nPress enter to exit");
      fflush(stdin);
          getchar(); 
}    


int main()
{
char ch;   
    fname=(data_t *)malloc(sizeof(data_t));

    FILE *fptr=NULL;
    atexit(quit);
    printf("Please enter the file name to read : ");
    fflush(stdin);
    scanf("%s",fname->data);    
    fptr=fopen(fname->data,"rb");

    if(fptr == NULL)
    {
            perror("Could not open the file ");
            return;
    }
    printf("\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
    printf("Contents of the file %s are : ",fname->data);

    while(fread(&fname, sizeof(data_t), 1,fptr) == 1)
    {
      // what do I put here? 
    }

    fclose(fptr);       
    return 0;
}

Я хочу прочитать любой двоичный файл, содержащий текст или цифры в нем, на моем компьютере и отобразить его на стандартном выводе.

Как мне это сделать?

Должен ли яобъявить массив данных структурного файла, например data_t data[100]?

Что я должен поместить в цикл while выше для отображения содержимого?

Пример: конечноесли я знаю атрибуты внутри структуры, такие как имя, возраст и т. д., я могу сделать что-то вроде

while ( fread ( &e, sizeof ( e ), 1, fp ) == 1 )
printf ( "\n%s %d %f", e.name, e.age, e.bs ) ;

Но как мне прочитать любое текстовое содержимое любого двоичного файла и отобразить его на стандартный вывод?

Ответы [ 2 ]

1 голос
/ 03 апреля 2011

Стандартная утилита strings(1) напечатает «печатаемые символы»; по умолчанию отображаются только четыре или более печатных символа, оканчивающихся непечатаемым символом. Это достаточно хорошее определение, и strings(1) упрощает использование параметра -n для отображения более длинных или более коротких строк.

Я могу подумать о двух механизмах реализации утилиты: один будет выделять массив длиной min символов и, следовательно, может использоваться для чтения из каналов; другой не выделил бы массив, но мог работать только с файлами. Поскольку версия массива более полезна, я опишу ее.

Вы настроили стандартный цикл:

int c;
int index = 0;
char arr[MAX];
FILE* f=fopen(whatever);

while((c=fgetc(f)) != EOF) {
    int flush_output = 0;

    if(isgraph(c))
        arr[index++]=c;
    else if(c == ' ' && index > 0)
        arr[index++]=c;
    else if(index > min)
        flush_output = 1;

    if(flush_output || index == (sizeof(arr)-2)) {
        arr[index]='\0';
        printf("%s", arr);
        index=0;
    }
}

В конце есть какой-то неудачный код; но мы не можем записать после конца массива, и мы должны распечатать выходные данные до конца массива, если у нас также было собрано более min символов. Это лучше, чем дублирование кода, но механизм может быть чище, чем этот.

0 голосов
/ 03 апреля 2011

Вы должны будете выбрать представление.Вы можете прочитать файл как 8-битные «порции», а затем значение как 8-битное целое число.Будет ли это работать для вас?

Если вы хотите увидеть пример программы, которая делает то, что вам нужно, вы должны проверить od(1)Он сбрасывает содержимое файла в различном формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...