#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 ) ;
但是如何读取任何二进制文件的任何文本内容并将其显示到stdout?
答案 0 :(得分:1)
标准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
个字符,我们应该只在数组末尾之前打印输出。这比重复代码要好,但可能有比这更清晰的机制。
答案 1 :(得分:0)
你必须决定一个代表。您可以将文件读出为8位“块”,然后将该值读取为8位整数。这对你有用吗?
如果你想看一个类似于你想要的程序的例子,你应该看看od(1)
。它以各种格式转储文件内容。