2016-12-20 10 views
0

Что не так с этим кодом? (В среде Qt я хотел использовать QTextStream, но итоговая строка пуста. С строкой код работает ОК. Кстати: есть ли какая-то конкретная причина, почему Qt не поддерживает непосредственно часто используемые шаблоны, такие как вектор и строка?)QTextStream предоставляет пустую строку

QString MyFileName; 
    QTextStream ts; 
    ts << DirName.c_str() 
     << QDate::currentDate().toString("_yyyy_MM_dd.log").toStdString().c_str() 
     << " (" << ++VolumeNumber << ")"; 
    ts >> MyFileName; 
    string FileName= MyFileName.toStdString(); 

При стандартном потоке гораздо проще:

ostringstream oss; 
    oss << DirName.c_str() << QDate::currentDate().toString("_yyyy_MM_dd.log").toStdString().c_str() << " (" << ++VolumeNumber << ")"; 
    FileName= oss.str(); 

Что такое преимущество подхода Qt?

+0

Что касается вашего вопроса, 'QTextStream' - это не тот инструмент, который вам нужен. Речь идет о сериализации текста (как правило, для файла), в то время как то, что вы хотите, легко достижимо как один лайнер с 'QString' сам по себе. – Resurrection

+0

'toStdString(). C_str()' не имеет никакого смысла в контексте 'QTextStream' btw. Вы можете напрямую подключить 'QString', который является результатом' QDate :: currentDate(). ToString (....) '. – E4z9

ответ

0

Это связано с тем, что устройство не назначает QTextStream. Он работает на QIODevice (вы также можете использовать QString, внутренне будет проксирован QTextStream через QBuffer), поэтому он ничего не делает. Вы должны сделать:

QString buffer; 
QTextStream ts(&buffer); 

после вводятся данные устройства, установленные в конце так чтение из него дает пустую строку, так что это еще одна ошибка. Чтобы прочитать это, вам необходимо перезагрузить устройство:

ts.device()->reset(); 

, который переместит базовое устройство в начало. Если это устройство с произвольным доступом, вы можете указать seek в определенное место и начать с него.

Все, что вы хотите, не будет работать, потому что вы сериализуете что-то еще, чем пытаетесь десериализовать (все проблемы выше не выдерживают). Вы должны составить строку, которую вы сначала сериализуете, сериализуйте ее с помощью QTextStream и снова десериализуйте ее.