#include<bits/stdc++.h>
Не делай этого. Вот почему
using namespace std;
Не делайте этого тоже. Вот почему
freopen("symbols.txt" , "r" , stdin);
Это очень плохо! Вы используете std::freopen
, чтобы связать файл с stdin
. Позже вы используете std::cin
для чтения из файла. То, что вы делаете, очень «хакерски», и иногда это может работать, но не всегда. stdin
(из C) и std::cin
(из C ++) не обязательно должны быть связаны подобным образом. freopen
- это API C, поэтому вы не должны использовать его в C ++.
Что вам нужно сделать, это открыть поток входного файла (std::ifstream
) и прочитать из который. Это может выглядеть примерно так:
#include <string> // std::string
#include <fstream> // std::ifstream std::ofstream
#include <iostream> // std::cerr
int main() {
std::ifstream symbols("symbols.txt");
if (!symbols.is_open()) {
// There was a problem opening the symbols file
// Maybe it was missing
// You should end the program here and write an error message
std::cerr << "Failed to open \"symbols.txt\"\n";
// returning an error code of 0 means "everything is fine"
// returning anything else means "something went wrong"
return 1;
}
// Try to choose more descriptive names than "X" and "Y"
char X;
std::string Y;
while (symbols >> X >> Y && X != '#') {
// ...
}
// ...
}
Ваш код будет более понятным, если вы создадите новый std::ifstream
для каждого открываемого файла (вместо повторного использования одного и того же). Проверка ошибок важна. Вы должны убедиться, что файл действительно открыт перед его использованием. Чтобы записать вывод в "handout.txt"
, вместо этого вы должны использовать поток выходного файла (std::ofstream
).
Есть что-то, что может вас запутать. Возьмите этот "symbols.txt"
файл:
A many words
B on the same line
C could cause problems
#
Если мы попытаемся прочитать его, используя текущий код, у нас возникнут проблемы:
symbols >> X >> Y;
// X is 'A'
// Y is "many" rather than "many words" as you might expect
Если в каждой строке есть только одно слово, тогда это не должно быть проблемой, но если есть несколько слов, вам, возможно, придется использовать std::getline
. std::getline
делает то, что говорит на банке. Он читает всю строку и записывает ее в заданную строку.
Вы бы использовали это так:
while (symbols >> X && X != '#' && std::getline(symbols, Y)) {
// ...
}
Пожалуйста, убедитесь, что вы понимаете код (прочитайте некоторые из ссылки) перед копированием из StackOverflow.