Поскольку C ++ 17 , вы можете:
std::string str(<apppropriate length here>, 0);
fscanf(filepointer, "%s\n", str.data());
str.resize(strlen(str.c_str()));
Но вы не должны.
Прежде всего, это не то, что вы хотитеэто делать.Если у вас есть строка ввода, такая как "Tom Jerry\n"
, она будет читать только "Tom"
, и, что еще хуже, она попытается прочитать "Jerry"
при следующем чтении из файла.Вы действительно должны использовать fgets()
, std::istream::getline()
или, что еще лучше, std::getline(file, str)
.
Во-вторых, '\0'
или char()
является допустимым символом в строке C ++.Если вы прочитаете "Tom\0Jerry\n"
, фактическая строка, которую ваш код сможет прочитать, будет содержать "Tom\0Jerry"
, что, вероятно, является допустимым результатом, но затем оно сократит его до "Tom"
из-за этого resize(strlen(str.c_str()))
.Вы можете облегчить его с помощью творческого использования спецификатора формата %n
, но зачем в первую очередь усложнять вашу жизнь?
В-третьих, подпрограммы ввода строки C ++ могут изменять размер строки при необходимости.В функциях C вам нужно указать ограничение размера строки, которое часто бывает произвольным.Это может привести к переполнению буфера, если вы неаккуратны с вашими спецификаторами формата (как в вашем примере), а также к логическим ошибкам, если вы неправильно обрабатываете особые случаи усеченного ввода.
Итак, просто используйтеstd::getline(file, str)
с вводом потока C ++, и вы избежите всего этого.