2011-04-03 47 views
1
#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循環中顯示內容?

一個例子:當然如果我知道像名字stucture裏面的屬性,年齡等那麼我可以這樣做

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

但我怎麼看任何二進制文件的任何文字內容,顯示它到標準輸出?

回答

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,則只應在數組末尾打印出之前的輸出。這會跳過重複的代碼,但可能會有比這更清潔的機制。

0

你必須決定一個表示。您可以將文件讀出爲8位「塊」,然後將該值作爲8位整數。這對你有用嗎?

如果你想看到一個程序的例子,它可以做類似於你想要的東西,你應該檢查出od(1)。它以各種格式轉儲文件內容。

+0

仍然我無法得到它,是否有任何其他的方式,並將此線爲二進制文件工作,而((c = fgetc(f))!= EOF)仍然有問題幫助?????? ?? – mukesh 2011-04-03 10:13:59

+0

我從一個名叫jim的人那裏得到了我的問題的回覆,他說:*爲了讀取二進制文件,您必須知道該文件是如何寫入的。你必須知道如何寫入變量,它們的大小,以字節爲單位。它們的類型,double,float,int,char,用戶定義的類型等等。這些變量被寫入文件的順序。並持續保存每個變量所需的字節數。 所以通常不可能取「任何」二進制文件並讀取內容。你可以閱讀一個精確的二進制文件,你知道確切的佈局,但不是一個二進制文件,你不知道佈局。** Jim – mukesh 2011-04-04 05:48:43