C二进制文件与ascii文件

时间:2015-02-08 07:02:32

标签: c binary

所以我是C的新手。我需要编写一个程序,它接受一个整数的二进制文件作为输入,用malloc分配一个足够大的数组,然后使用read()c函数将每个整数存储在二进制文件中文件位于数组中的相应位置。我的问题是我不知道如何区分这两者。当我打印出存储在这个分配的数组空间中的数据时,它只显示二进制数据的Ascii值作为一串字符。 所以例如,如果我有二进制数0000 0001,位置[0] - [7]的数组将是该二进制数中每个位的ascii值。

基本上我试图读取每一行并将那些行int表示二进制信息存储在1个数组位置,所以像上面的例子一样,期望的结果是: [0] - 1.我需要做一些转换算法吗?我相信有一种方法可以让c只识别它的二进制信息,而不是ascii,因为有两种不同的文件类型:二进制和ASCII。非常感谢任何帮助,提前谢谢!

P.s我只能使用这些函数调用:open,close,read,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);
                    }
            }

2 个答案:

答案 0 :(得分:1)

你的read()可能会出错,因为你试图读取numBytes整数,但整数不是字节。如果你已经正确地检查了read的返回值,你会看到文件不是numBytes * sizeof(int)large。如果文件确实包含整数,而不是ASCII数字字符串,那么您可以访问整数:

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

如果文件包含ASCII数字字符串,则需要一个分隔符来指示一个数字结束的位置以及下一个数字的开始并且可以写入:

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)
}

答案 1 :(得分:1)

如果您尝试从二进制文件(不是ASCII文件)中获取每个位并将其存储在数组中,则可以使用以下代码执行此操作。

如果您想了解有关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);
}