Я не слишком хорошо все это проверил, но, кажется, ниже работает:
//! read a line of text from a FILE* to a std::string, returns false on 'no data'
bool stringfgets(FILE* fp, std::string& line)
{
char buffer[1024];
line.clear();
do {
if(!fgets(buffer, sizeof(buffer), fp))
return !line.empty();
line.append(buffer);
} while(!strchr(buffer, '\n'));
return true;
}
Имейте в виду, однако, что это с радостью прочитает текстовую строку размером 100 ГБ, поэтому следует позаботиться о том, чтобы это был не DoS-вектор из ненадежных исходных файлов или сокетов.