2015-02-08 187 views
0

所以即時通訊全新的C.我需要編寫一個程序,接受一個整數的二進制文件作爲輸入,與malloc分配一個足夠大的數組,然後使用read()c函數將二進制文件中的每個整數存儲在數組中的相應位置。我的問題是我不知道如何區分兩者。當我打印出存儲在這個分配的數組空間中的數據時,它只顯示二進制數據的Ascii值作爲一串字符。 例如,如果我有二進制數0000 0001,位置[0] - [7]中的數組將是每個二進制數中每個位的ascii值。C二進制文件與ascii文件

基本上我試圖讀取每一行並存儲該行二進制信息在一個數組位置的int表示,所以像上面的例子所期望的結果是: [0] - 1.是否存在一些轉換算法I需要做?我相信有一種方法可以讓C識別它的二進制信息,而不是ascii,因爲有2種不同的文件類型:二進制和ASCII。任何幫助將不勝感激,提前致謝!

詩我只能使用這些函數調用:打開,關閉,讀,malloc的,FSTAT,printf的

else 
    { 
      fileDescriptor = open(argv[1], O_RDONLY, 0); 
      if (fileDescriptor == -1){ 
        printf("File Not Found\n"); 
        exit(1); 
      } 
      else{ 
        if (fstat(fileDescriptor, &fileStat) < 0){ 
          printf("Trouble pulling statistics of file\n"); 
          exit(1); 
        } 
        else 
        { 
          numBytes = fileStat.st_size; 
          filePointer = (char*) malloc(numBytes); 
        n = read(fileDescriptor, filePointer, (numBytes * sizeof(int))); 

          if(n < 0){ 
            printf("Problem reading the file\n"); 
            exit(1); 
          } 
            numerator = 0; 
            numCount = 0; 
            average = 0; 

            while(*filePointer != NULL) 
            { 
            numerator += *filePointer; 
            printf("data in array: %d\n", *filePointer); 
            filePointer++; 
            numCount++; 
            } 
          average = (double) numerator/(double) numCount; 
          printf("Average: %f\n", average); 

          printf("Total Numbers: %d\n", numCount); 
        } 
      } 
+1

你說你有一個二進制文件,但然後說說從文件中讀取行。 「行」是一個文本概念,二進制文件沒有行,只有二進制數據。您正在使用不區分文本和二進制文件的POSIX(打開/讀取)文件功能 - 文件只是一系列字節,您可以將這些字節視爲二進制或ASCII文本或UTF-8文字或其他。 – 2015-02-08 07:32:19

+0

好吧,這有助於很多。我只是困惑,那麼我應該如何通過我的filePointer變量指向的數組來獲取相關信息。我打印出來,每個位置的數據仍然只是每個位的ASCII值,當我想要整數表示。在這種情況下,訪問每個位置的整數來計算平均值。 filePointer是一個指向char類型的指針嗎? – RunFranks525 2015-02-08 07:48:17

+0

你做了很多不必要的其他縮進,這使得代碼不易讀。請注意,在所有if語句中,如果條件爲真,則返回或退出,因此else {是不必要的。 – 2015-02-08 12:03:45

回答

1

你的閱讀()可以去可怕的錯誤,因爲你嘗試閱讀的numBytes整數,但整數不字節。如果你已經正確地檢查了讀取的返回值,你會看到該文件不是numBytes * sizeof(int)很大。如果該文件確實包含整數,而不是ASCII數字字符串,那麼你就可以訪問該整數爲:如果文件中包含數字ASCII字符串

int *pInt= (int *)filePointer; 
while (pInt < filePointer+numBytes) { printf("%d,", *pInt); pInt++;} 

,你需要一個分隔符信號,其中一個號結束,接下來的開始,可以這樣寫:

char *s= filePointer; 
while (s<filePointer+numBytes) { 
    int num= 0; 
    while (s<filePointer+numBytes && '0'<= *s && *s<='9') { 
     num= num*10 + *s-'0'; 
     s++; 
    } 
    while (s<filePointer+numBytes && !('0'<= *s && *s<='9')) s++; // skip separator(s) 
} 
+0

這很接近,它的幫助很大!但現在它似乎不處理負整數。一旦指針旋轉通過內存位置時,while循環條件評估的結果爲負值,並且其餘整數永遠不會被打中。從文件中讀取的字節數是正確的,所以它在這裏得到了一些東西。在我的例子中,我有13個整數,所以52字節,我打印出來檢查和numBytes其實是52.任何想法可能會導致這個小毛刺?非常感謝! – RunFranks525 2015-02-08 22:50:39

+0

我明白了,我意外地讓while循環由指向它的指針本身的值來控制 – RunFranks525 2015-02-09 01:44:43

1

如果你試圖從二進制文件(不是一個ASCII文件)中的每一位,並將其存儲在一個數組,那麼你可以使用下面的代碼來做到這一點。

如果您想了解更多關於FO ASCII和二進制文件的區別閱讀後https://stackoverflow.com/a/28301127/3095460

ASCII文件也是一個二進制文件,除,字符與ASCII字符集和每個字符編碼只需要一內存中的字節。例如,如果要在二進制文件中放入整數10000,則只需要4個字節(二進制中的int大小),但ascii文件需要5個字節。所以從一個ASCII文件讀取10000將讀取5個字節得到10000和解碼爲一個整數,但一個二進制文件,我們必須單獨讀取4個字節。

所以要讀一個二進制文件,你需要一個二進制文件編輯器。否則普通的編輯器會解碼二進制文件,並顯示我們用肉眼無法理解的東西,直到仔細觀察字節爲止。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main(){ 

    int fd; 
    char out; 
    struct stat fileStat; 
    int* binArray; 
    int bin_size = 0, i = 0, j = 0; 

    if((fd = open("binfile",O_RDONLY)) != -1) { 
     if (fstat(fd, &fileStat) == 0){ 
      if (fileStat.st_size != 0 && 
       (binArray = (int*) malloc(fileStat.st_size * 8)) != NULL) { 
       for(i = 0; i < fileStat.st_size; ++i) { 
        if(read(fd, &out, sizeof(char)) == 1) { 
         for(j = 7; j >= 0; --j) { 
          binArray[bin_size++] = (out >> j) & 0x01; 
          printf("%d",binArray[bin_size-1]); 
         } 
        } 
       } 
      } 
      else { 
       fprintf(stderr,"Trouble Allocating Memory\n"); 
      } 
     } 
     else { 
      fprintf(stderr,"Trouble pulling statistics of file\n"); 
     } 
    } 
    else { 
     fprintf(stderr,"Trouble Opening the File\n"); 
    } 
    close(fd); 
}