чтение файла с функцией в массив в основной функции

#c #file #pointers

#c #файл #указатели

Вопрос:

Я пытаюсь прочитать файл bin с помощью функции. Функции получают имя файла и адрес массива в основной функции. Функция показывает мне правильные байты, но метод, который я использую для заполнения массива из основной функции, является ошибкой. Может кто-нибудь помочь мне и объяснить, потому что я не разбираюсь в указателях и т.д.

Когда я использую файл bin со следующими байтами: 00 00 05 20

Функции-printf выдает мне правильные байты, но массив данных имеет следующее значение: 0 5 0 0

 #include <stdio.h>
#include <stdlib.h>

#define MAX_BYTES_IN_FILE 10000

int get_byte_from_file(FILE *stream, int *dataarray) {
   int counter = 0, datastream[MAX_BYTES_IN_FILE];
                               
   while( ( datastream[counter]=fgetc(stream)) != EOF){
      printf("%d ", datastream[counter]);
      dataarray[counter] = datastream[counter];
      counter  = 1;
   }
   printf("nnn");

   return counter;
} 


int main(int argc, char **argv) {
   FILE *datei;
   char filename[255];
   int number_of_bytes;
   int* dataarray[MAX_BYTES_IN_FILE];
   
   datei=fopen(argv[1],"r");
   number_of_bytes = get_byte_from_file(datei, amp;dataarray);
   
   for (int i=0;i<number_of_bytes;i  )
       printf("%d ",dataarray[i]);
   
   return EXIT_SUCCESS;
}
  

Ответ №1:

Я не думаю, что у вас есть причины использовать здесь массивы указателей.

Также двоичные файлы должны быть открыты в двоичном режиме, и следует проверить, прошло ли открытие файла успешно.

Попробуйте это вместо вашей main функции:

 int main(int argc, char **argv) {
   FILE *datei;
   char filename[255];
   int number_of_bytes;
   int dataarray[MAX_BYTES_IN_FILE]; /* use an array of integers instead of an array of pointers */
   
   if (argc < 2) { /* check if we have valid argv[1] */
       fputs("no file name givenn", stderr);
       return EXIT_FAILURE;
   }
   datei=fopen(argv[1],"rb"); /* use rb instead of r to use binary mode */
   if (datei == NULL) { /* check if opening file suceeded */
       fputs("file open failedn", stderr);
       return EXIT_FAILURE;
   }
   /* you should remove amp; here, and this array will be converted to a pointer to the first element */
   number_of_bytes = get_byte_from_file(datei, dataarray);
   
   for (int i=0;i<number_of_bytes;i  )
       printf("%d ",dataarray[i]);
   
   return EXIT_SUCCESS;
}
  

Комментарии:

1. Вы должны указать, что отсутствие проверки, если fopen выполняется успешно, является вопиющей ошибкой