Ошибка сегментирования при работе с файлами

На функции следует разбивать любое сложное или неочевидное действие. Имена функций - лучшие комментарии.

Она делает совершенно не это! Она заполняет массив чаров. Да, и зачем вообще такая функция, если есть fgets?

В данном случае - безусловно. Функция должна брать дескриптор файла, а не его имя.

Принцип единственной обязанности

Принципы программирования

Антипаттерны

Заметь - ничего специфичного для С в этом нет.

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

Дополнительная проверка не нужна. Нужна всего одна такая проверка. А у тебя нет ни одной. Потому что данные из файла СНАЧАЛА пишутся в массив чаров, и только потом сравниваются с EOF. Почитай книжки, посмотри, как обычно оформляются такого рода циклы. Например, каноничный вариант из книги Кернигана и Ричи. Как-то так:

CВыделить код

1
2
3
4

int c; // Обрати внимание - int.
while( (c = fgetc(in)) != EOF ) {  // fgetc выдает результат типа int, и EOF выходит за пределы типа char
    str++ = c;  // не стоит беспокоиться о том, что int записывается в char - компилятор приведет типы
}

Это не единственная и даже не самая страшная твоя ошибка. По крайней мере, из-за этой ошибки программа сразу падает. Это самый безобидный вид ошибок. Страшнее ошибки, которые могут долго не проявляться или проявляются так, что непонятно, где она вкралась. Строка while ((result_str[i] = fgetc(work_file)) != EOF) ужасна.