fgets(text, 80, infile);
fgets()
- это функция библиотеки C, которая ожидает char *
в качестве своего первого параметра. Он абсолютно ничего не знает ни о каком классе C ++, и не только о std::string
, который вы передаете в качестве первого параметра. Также fgets()
не имеет никакого представления о классе C ++ std::ifstream
, который вы пытаетесь передать ему в качестве третьего параметра. И это именно то, что говорится в сообщении об ошибке вашего компилятора.
Вы случайно смешиваете код на C и C ++, что приводит к повторяющейся путанице.
char inputfilename[80], outputfilename[80];
Здесь вы также должны использовать std::string
вместо массивов в стиле C произвольного размера.
while (infile.eof()==0) {
Это всегда ошибка , и прочтите эту связанную статью для получения дополнительной информации.
fprintf(outfile,"%d. %s\n", text);
Опять же: fprintf
также является библиотечной функцией C, которая абсолютно ничего не знает о классах C ++, таких как std::string
и std::ofstream
. В любом случае это ошибка, потому что эта строка имеет заполнители для двух параметров: целое число, %d
и строка в стиле C, %s
; и вы даете здесь только один параметр, text
. Если бы вы писали C вместо кода C ++, это тоже не сработало бы, но это в основном академично. Это программа на C ++, и эта функция библиотеки C не имеет никакого отношения к делу, во-первых, здесь.
Когда вы читаете из std::ifstream
:
Вы можете использовать std::getline
, чтобы прочитать всю строку текста в std::string
В качестве альтернативы вы можете использовать отформатированный оператор извлечения >>
Или вы можете использовать различные методы объекта std::ifstream
для чтения из файла и в подходящий буфер
Эти альтернативы не эквивалентны (иначе какой смысл?), И они делают разные вещи, и правильность выбора зависит от требований.
Аналогично, для записи в std::ofstream
вы можете использовать:
Оператор форматированного вывода <<
.
Различные методы самого объекта std::ofstream
.
И в некоторых сложных ситуациях вы можете воспользоваться библиотекой итераторов, а также реализовать чтение и запись, используя итераторы ввода и вывода.
Правильный подход зависит от конкретной ситуации. Для получения дополнительной информации о том, как читать и писать из файлов в C ++ с использованием этих подходов, см. Любую хорошую книгу по C ++ . Какую бы книгу C ++ на самом деле ни советовали вам использовать fgets()
для чтения из std::ifstream
и в std::string
: выбросьте ее и получите лучшую книгу из списка, указанного выше. Если это именно то, что вы нашли в какой-то программе в Интернете - вы не можете выучить C ++ таким образом, собрав воедино разные части разных программ, и надеясь, что результаты сработают. Чтобы исправить все ваши ошибки компиляции: удалите весь тот код C, который абсолютно ничего не знает о C ++, и замените его на надлежащий код C ++, используя любой из вариантов, которые я обрисовал в общих чертах выше, используя примеры из книг C ++, связанных выше, в качестве ссылки .