В условии для вашего цикла while у вас есть
ch[i] = fgetc(fp) != EOF
Так как! = Имеет более высокий приоритет, чем =, это эквивалентно
ch[i] = (fgetc(fp) != EOF)
, которое не оцениваетсяна символ, а не 0 или ненулевое значение из сравнения.
На мой взгляд, лучший способ сделать это - прочитать всю строку, изменить ее, а затем снова открыть файлв режиме записи и обратной записи, если вы все равно собираетесь выделить массив для содержимого.