Senza specificare un path, il programma si aspetta il file.txt nella stessa directory dell'eseguibile, che può non coincidere con la directory dove ci sono i sorgenti. Specifica l'intero path per evitare problemi (o cerca in qualche sottodirectory debug o similare).
if (!f) // etc
va più che bene, mentre non va molto bene
while(f.good())
{
getline(f, s); //legge tutta la riga dal file e la mette nella variabile s
cout<<s<<endl;
}
in quanto stamperebbe due volte l'ultima riga.
Il modo canonico è:
while(getline(f,s))
{
cout<<s<<endl;
}