2015-02-08 3 views
0

Так что я новый для C. Мне нужно написать программу, которая принимает двоичный файл целых чисел в качестве входных данных, выделяет достаточно большой массив с malloc, затем использует функцию read() c для хранения каждого целого в двоичном файле в соответствующем месте в массиве. Моя проблема в том, что я не знаю, как различать эти два. когда я распечатываю данные, хранящиеся в этом распределенном пространстве массивов, он просто показывает значение Ascii двоичных данных, взятых в виде строки символов. , так, например, если у меня есть двоичный номер 0000 0001, массив из местоположений [0] - [7] будет каждое значение ascii каждого бита в этом двоичном числе.C двоичные файлы и файлы ascii

В основном, я пытаюсь прочитать каждую строку и сохранить это строковое int представление двоичной информации в 1 месте массива, так что, как и в предыдущем примере, желаемый результат: [0] - 1. Есть ли какой-то алгоритм преобразования I нужно сделать? Я считаю, что для того, чтобы c просто узнать, что его двоичная информация, а не ascii, потому что существует два разных типа файлов: двоичный и ASCII. Любая помощь будет принята с благодарностью, спасибо заранее!

Ps я могу использовать только эти вызовы функций: открытие, закрытие, чтение, таНос, 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

Вы говорите, что у вас есть двоичный файл, но затем говорите о чтении строк из файла. «lines» - это текстовая концепция, а двоичные файлы не имеют строк, а всего двоичных данных. Вы используете функции POSIX (open/read), которые не различают текстовые и двоичные файлы, а всего лишь последовательность байтов, и вам решать эти байты как бинарные или ASCII-тексты или UTF-8 текст или что-то еще. –

+0

хорошо, это очень помогает. Я просто смущен, как иначе я должен пройти через массив, на который указывает моя переменная filePointer, чтобы получить соответствующую информацию. Я распечатываю его, и данные в каждом месте по-прежнему являются только значениями ascii для каждого бита, когда я хочу, чтобы это целочисленное представление. В этом случае обращайтесь к каждому местоположению целиком, чтобы вычислить среднее значение. это то, что filePointer является указателем на тип char? – RunFranks525

+0

Вы делаете много лишних отступов, что делает код менее читаемым. Обратите внимание, что во всех ваших операторах if, если условие истинно, есть возврат или выход, поэтому else {не нужно. –

ответ

1

Ваше чтение() может пойти наперекосяк, потому что вы пытаетесь прочитать numBytes целые числа, но целые числа, не являются байт. Если вы правильно проверили возвращаемое значение из чтения, вы бы увидели, что файл не является numBytes * sizeof (int) большим. Если файл действительно содержит целые числа, а не строки 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) 
} 
+0

Это близко, и это большая помощь! Но сейчас он, похоже, не обрабатывает отрицательные целые числа. Как только указатель, вращающийся по ячейкам памяти, попадает в отрицательный int, выполняется условие while while, а остальные целые числа никогда не попадают. Количество байтов, считанных из файла, является правильным, поэтому он должен быть чем-то внизу. в моем примере у меня есть 13 целых чисел, поэтому 52 байта, я распечатываю это для проверки, а numBytes - это 52. Есть идеи о том, что может вызвать этот небольшой глюк? Спасибо! – RunFranks525

+0

Я понял это, я случайно имел цикл while, управляемый значением, указывающим не на сам указатель – RunFranks525

1

Если вы пытаетесь получить каждый бит из двоичного файла (не файл ASCII) и сохранить его в массиве, то вы можете использовать следующий код, чтобы сделать это.

Если вы хотите узнать больше о разнице Fo ASCII и двоичного файла читать пост https://stackoverflow.com/a/28301127/3095460

ASCII файл также двоичный файл, за исключением того, что символы кодируются с ASCII набор символов и каждый символ взять только один байта в памяти. например, если вы хотите поместить целое число 10000 в двоичный файл, ему нужно всего 4 байта (размер int в двоичном формате), но для файла ascii потребуется 5 байтов. поэтому чтение 10000 из файла ascii будет читать 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); 
} 
Смежные вопросы