La prima cosa che mi viene in mente:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
in main() {
ifstream in("in");
char t;
int cont=1;
string s_riga;
int i_riga;
cout << "Riga da leggere: "; cin >> i_riga;
while(cont < i_riga) {
in.get(t);
if(t == '\n') cont++;
}
while (in.get(t), t!= '\n') s_riga.push_back(t);
cout << s_riga << "\n";
}
Chiaramente c'è lo stretto necessario ,senza neanche un controllo.
Non credo sia granchè efficente però, visto che comunque leggi sequenzialmente fino alla riga che desideri.