Почему я получаю ошибку сегментации с этим кодом? - PullRequest
0 голосов
/ 18 февраля 2010

С чем может быть проблема?

#include <stdio.h>
#include <string.h>
#define SIZE 19

void filePrint(char fileName[]);

int main (void)
{
   char fileRead[SIZE];

   filePrint(fileRead);

   return 0;
}

void filePrint(char fileName[])
{
   FILE *inp;
   int input_status = 0;
   char readFile[SIZE];

   inp = fopen(fileName, "r");

   printf("\nEnter a file to print:\n");

   input_status = fscanf(inp, "%s", readFile);

   while (input_status != EOF)  
   {
      printf("%s\n", readFile);
      input_status = fscanf(inp, "%s", readFile);
   }

   fclose(inp);
}

Ответы [ 6 ]

7 голосов
/ 18 февраля 2010

Я думаю, вам следует вернуться и прочитать главу о Файловый ввод / вывод .

Выполните код, который вы написали в своем уме, и вслух.

Вы пытаетесь открыть файл, сохраненный в строке fileName, но строка не была инициализирована для чего-либо действительного (для fopen). fopen возвращает нулевой указатель, если не может открыть файл. Вы не можете использовать этот пустой указатель для чтения. Кроме того, если вы используете fscanf для чтения из только что открытого файла, пользователь не может ничего печатать.

3 голосов
/ 18 февраля 2010

Помимо прочего, вы никогда не определяете файл для чтения?

2 голосов
/ 18 февраля 2010

При вызове fopen(fileName, "r");, fileName не было заполнено именем файла. Это неинициализированный массив.

1 голос
/ 02 марта 2010

Вы должны указать имя файла для функции.

Вы передаете массив символов без значения. Поэтому в этот раз значение массива равно нулю. В функции fopen вы пытаетесь открыть файл.

Таким образом, функция fopen возвращает нулевое значение. Если функция fopen успешно откроет файл, она вернет правильный указатель файла. В противном случае он вернет ноль, ошибка будет сохранена в errno.

Используя нулевой указатель, вы не можете прочитать.

1 голос
/ 01 марта 2010

Если вы упомянули имя файла в массиве fileRead [], вы получите ошибку сегментации. Поскольку вы указали размер массива, равный 19. Вы должны указать большой размер массива в массиве fileRead [], например, 1024.

1 голос
/ 18 февраля 2010

Похоже, что вы никогда ничего не помещали в fileRead [] в main, прежде чем передавали это в filePrint (), который передал это fopen (). Т.е. "неинициализированные данные"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...