C二进制文件与ascii文件

问题描述:

所以即时通讯全新的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

你的阅读()可以去可怕的错误,因为你尝试阅读的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

如果你试图从二进制文件(不是一个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); 
}