не может получить доступ к месту в памяти - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь прочитать двоичный файл размером 32 байта в C, однако у меня постоянно возникает «ошибка сегментации (код сброшен)», когда я запускаю свою программу, было бы здорово, если бы кто-нибудь мог помочь мне, указавГде я неправ?.мой код здесь ниже:

int main()
{


   char *binary = "/path/to/myfiles/program1.ijvm";
   FILE *fp;
   char buffer[32];

   // Open read-only
   fp = fopen(binary, "rb");

   // Read 128 bytes into buffer
   fread (buffer, sizeof(char), 32, fp);



   return 0;
 }

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Вы должны проверить результат возврата от fopen().

Я предполагаю, что вы получаете ошибку segfault в вызове fread(), поскольку файл данных не существует,или не удалось открыть, и вы пытаетесь работать со структурой NULL FILE.

См. следующий безопасный код:

#include <stdio.h>
#include <stdint.h>

#define SIZE_BUFFER      32

int main()
{
   char *binary = "data.txt";
   FILE *fp = NULL;
   char buffer[SIZE_BUFFER];

   // Open read-only
   fp = fopen(binary, "rb");

   // Read SIZE_BUFFER bytes into buffer
   if( fp )
   {
        printf("Elements read %ld\n", fread (buffer, sizeof(char), SIZE_BUFFER, fp));
        fclose(fp);
   }
   else
   {
        // Use perror() here to show a text description of what failed and why
        perror("Unable to open file: ");
   }
   return 0;
 }

Когда я выполняю этот код, он не падаети напечатает количество прочитанных элементов, если файл открыт, или напечатает «Невозможно открыть файл», если файл не может быть открыт.

Как уже упоминалось в комментариях, вы также должны закрыть выходящий файл.,Вы можете сделать следующее:

FILE *fp = fopen(.....);

Вместо того, чтобы объявлять и присваивать два отдельных шага.

1 голос
/ 12 июня 2019

Это из-за пути.Убедитесь, что "/path/to/myfiles/program1.ijvm" указывает на существующий файл.Вы всегда должны проверять возвращаемое значение fopen.

\\Open read-only
fp = fopen(binary, "rb");
if(fp==NULL){
    perror("problem opening the file");
    exit(EXIT_FAILURE);
}

Обратите внимание, что вы читаете 32 байта в своем буфере, а не 128, как говорится в вашем комментарии.

0 голосов
/ 12 июня 2019

Есть две возможные причины

  1. Функция fopen(3) не выполнена по какой-то причине, что означает, что fp равен NULL, а затем вы пытаетесь использовать нулевой указатель в fread(3).Это может привести к сбою.@OznOg уже дал тонкий намек, чтобы посмотреть в этом направлении.
  2. Если вызов fopen успешен (т. Е. fp не равен NULL после вызова fopen), код все равно может завершиться сбоемпотому что вы читаете 32 символа в переменную binary, в то время как binary был инициализирован только с 30 символами.
...