#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
выполняется успешно, является вопиющей ошибкой