Чтение файлов на С обычно немного грязно. Первая проблема, которую я вижу, это способ использования ch в основном цикле. Первый раз
while (ch != EOF)
выполняется, ch неинициализирован, и если он удерживает EOF
, основной цикл не будет выполняться вообще. Я обычно использую следующую структуру для чтения из файлов:
FILE *fInput = fopen("input.txt", "r");
int ch; /* need an int to hold EOF */
for (;;)
{
ch = fgetc(fInput);
if (ch == EOF) break;
...
}
Кроме того, вам может понадобиться прочитать концепцию указателя файла. Например, после прочтения оставшейся части src
вы fseek()
вперед и пропускаете еще несколько символов, прежде чем копировать данные в f2. По сути, вы читаете m
, читаете or
(с fgets()
- и в нераспределенный буфер s1
, который в ближайшем будущем приведет вас к ка-буму), пропустите еще 2 символа (теперь ваш указатель) это, наконец, n из «morning»), скопируйте «ng» в f2
, попробуйте записать EOF в f2 в этом цикле (отсюда и вышеупомянутый шаблон для чтения до EOF
), отыщите два символа назад (которые могут один раз завершиться Вы достигаете EOF
, мои функции файла C в наши дни немного устарели), пишите "even" в f1 (что должно, если я ошибаюсь из-за поиска после EOF
, установить входной файл в "mornieven", и не изменяться это если я прав). Таким образом, я не думаю, что код делает то, что вы намереваетесь делать.
Я бы порекомендовал создать вашу функцию. Каждое из следующего может быть написано как программа, которую вы должны проверить и закончить, прежде чем перейти к следующему шагу:
- безопасно прочитайте файл и распечатайте его
- обнаружить содержимое
src
и распечатать остальную часть ввода
- сохранить оставшуюся часть ввода во второй файл вместо печати
- замените
src
на dest
в первом файле и проигнорируйте остальные (поскольку вы открываете входной файл с помощью 'rw', это урезает остальную часть ввода). Возможно, вам потребуется выполнить функцию fseek (), чтобы очистить состояние EOF. Также посмотрите на ftell()
, чтобы записать позицию, к которой вы можете вернуться, используя fseek()
- наконец, скопируйте все, что вы сохранили, во второй файл после замены
src
на dest
(здесь не нужно закрывать f1. Но лучше открыть f2 как запись, закрыть после копирования из первого файла и открыть заново как читать, чтобы выполнить копирование обратно в f1).
Кроме того, когда вам нужен буфер (например, s1), просто используйте пока достаточно большой массив, но посмотрите на функции malloc()
и free()
для динамического распределения памяти в подобных ситуациях.