No dobrze... po publikacji treści zadania, IMHO masz następujące wyzwania ;)
1. Otworzyć poprawnie pliki i w przypadku niepowodzenia otwarcia, załamać program.
2. Iterować po danych w pliku wczytując kolejno słowa i w przypadku gdy słowo jest palindromem, wyświetlić je.
3. Po dojściu do końca danych wczytywanych, zamknąć poprawnie plik.
Pkt. 1 kwalifikuje się albo do wyjątku albo do brutalnego zakończenia programu przez exit().
Pkt. 2 Zgadzam się z @Radfler'em że powinna to być funkcja sprawdzająca czy słowo jest palindromem.
Pkt. 3 Tak się składa że destruktor obiektów ifstream/ofstream/fstream, poprawnie zamyka plik.
Nazwę pliku przekazujesz przez stałą referencję na std::string aby nie kopiować potencjalnie długich nazw. Jeśli z plikiem będzie coś .. "nie tak", nastąpi załamanie programu z wcześniejszym komunikatem na strumień błędów.
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
std::ifstream openFile(const std::string& fileName) {
std::ifstream file(fileName);
if(!file) {
std::cerr << "Błąd otwarcia pliku: " << fileName << '\n';
exit(EXIT_FAILURE);
}
return file;
}
int main() {
std::ifstream file = openFile("dane.txt");
}
Żeby zaproponować może coś innego niż koledzy... Zauważ że wystarczą 2 indeksy. Jeden na początku napisu, drugi na jego końcu. Porównywać można do momentu gdy pierwszy (początkowy) jest mniejszy niż drugi (końcowy). W zadaniu każde słowo ma 2 lub więcej znaków więc jesteś pewien że nie ma mniej. Normalnie byś to sprawdzał, tu się możesz powstrzymać.
#include <string>
#include <iostream>
#include <ios>
bool isPalindrome(const std::string& message) {
size_t first = 0;
size_t last = message.size() - 1;
bool answer = true;
while(first < last) {
if(message[first] != message[last]) {
answer = false;
break;
}
++first;
--last;
}
return answer;
}
int main() {
std::string msg = "ABBA";
std::cout << std::boolalpha << isPalindrome(msg) << '\n';
}
Główna część programu to otwarcie pliku z przypisaniem do obiektu file oraz iterowanie przez while(!file) { ... } z wyświetlaniem palindromu. Tu już połącz funkcje w działający program :-)
PS. Przy użyciu iteratorów i algorytmów, kod staje się prosty :-)
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <algorithm>
std::ifstream openFile(const std::string& fileName) {
std::ifstream file(fileName);
if(!file) {
std::cerr << "Błąd otwarcia pliku: " << fileName << '\n';
exit(EXIT_FAILURE);
}
return file;
}
bool isPalindrome(const std::string& message) {
auto mid = message.cbegin() + (message.size() / 2);
return std::equal(message.cbegin(), mid, message.crbegin());
}
int main() {
auto file = openFile("dane.txt");
std::istream_iterator<std::string> iBeg(file), iEnd;
std::ostream_iterator<std::string> iOut(std::cout, "\n");
std::copy_if(iBeg, iEnd, iOut, isPalindrome);
}