Ввод из файла и вывод в файл
Способов два. Для олимпиадной задачи хватит двух строк freopen в начале main — остальной код не меняется. Если программе нужны одновременно и файлы, и экран, берите файловые потоки ifstream и ofstream.
Какой способ выбрать
Олимпиадная задачаfreopen
Две строки в начале main:
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int a, b;
cin >> a >> b;
cout << a + b << "\n";
return 0;
}freopen подменяет стандартный ввод (stdin) файлом input.txt, а стандартный вывод (stdout) — файлом output.txt. Дальше cin и cout (и scanf, printf) работают с файлами, а остальной код остаётся прежним.
Прочитайте условие внимательно. Во многих проверяющих системах ввод идёт с клавиатуры (стандартный ввод), а файлы не нужны. Строки с freopen в такой задаче могут сломать решение. Если в условии указаны имена файлов — пишите ровно их.
Удобный приём при отладке: закомментировать строки freopen (//), чтобы вводить данные с клавиатуры, и вернуть их перед отправкой решения.
Нужны и файлы, и экранifstream и ofstream
Способ C++ — файловые потоки из <fstream>. Работают так же, как cin и cout, только со своими именами:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream fin("input.txt");
if (!fin.is_open()) {
cerr << "cannot open input.txt\n";
return 1;
}
ofstream fout("output.txt");
int n;
fin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
int x;
fin >> x;
sum += x;
}
fout << sum << "\n";
return 0;
}ifstream fin("input.txt")— открыть файл для чтения;fin >> n— какcin >> n.ofstream fout("output.txt")— создать файл (или стереть старый) и писать в него;fout << x— какcout.getline(fin, line)читает строку из файла.- Файлы закроются сами в конце
main.
Этот способ удобен, когда в программе одновременно нужны и файлы, и экран: cout по-прежнему выводит в консоль.
ofstream при открытии стирает содержимое файла. Не указывайте в нём имя файла с данными, которые нужны. Дописать в конец существующего файла можно так: ofstream fout("log.txt", ios::app);.
Файл не открывается
Чаще всего программа ищет файл не там. Имя без пути ("input.txt") ищется в текущей папке — откуда программу запустили, а это не всегда папка с .cpp или .exe:
- в командной строке — папка, в которой вы находитесь (
cd); - в Visual Studio и Code::Blocks при запуске из среды — обычно папка проекта;
- двойной щелчок по
.exe— папка, где лежит.exe.
Если не уверены, положите input.txt рядом с программой и запустите её из командной строки из этой папки.
Другие причины:
- в Windows скрыты расширения, и файл на самом деле называется
input.txt.txt. Включите показ расширений в проводнике; - имя набрано с ошибкой: русская
свместо латинскойc, лишний пробел,Input.txtвместоinput.txt(в Linux, а значит и во многих проверяющих системах, большие и маленькие буквы в именах файлов различаются).
Проверка if (!fin.is_open()) из примера выше сразу сообщит, что файл не найден, вместо того чтобы молча читать пустоту.