Cześć. Dużo zależy od pliku napisy.txt, czy jest w nim dokładnie lub mniej niż 400 słów. Jeżeli jest więcej, to wynik zostanie pokazany kilkukrotnie. Źródłem problemów jest pętla:
while(!napisy.eof())
Sprawdzasz w niej czy dotarłeś do końca pliku. Lepiej byłoby uzyskać warunek, z którego dowiesz się ile porcji danych jest w pliku. Taką wiedzę możesz później wykorzystać w dalszej części programu.
Przepisałem to dla Ciebie tutaj:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string s1[200], s2[200];
ifstream napisy;
napisy.open("napisy.txt");
if (napisy.good())
{
int ilosc = 0;
while (napisy >> s1[ilosc] && napisy >> s2[ilosc])
ilosc++;
int licznik = 0;
for (int i = 0; i < ilosc; i++)
{
if (s1[i].size() >= s2[i].size() * 3 || s1[i].size() * 3 <= s2[i].size())
{
licznik++;
}
}
cout << licznik << endl;
}
else
cout << "Nie udalo sie otworzyc pliku lub plik nie istnieje." << endl;
napisy.close();
return 0;
}
Poniższa instrukcja warunkowa sprawdza czy udało się otworzyć plik.
if (napisy.good())
Zawsze w przypadku pobierania danych z pliku do programu warto mieć w kodzie tego typu warunek.