#c #qt #qstring #qdatetime
#c #qt #qstring #qdatetime
Вопрос:
У меня есть файл .txt, который заполнен строками, подобными приведенным ниже:
- 2011-03-03 03.33.13.222 4 2000 Информационный БИЗНЕС … и т.д. блабла
- 2011-03-03 03.33.13.333 4 2000 Информационный БИЗНЕС … и т.д. блабла
- 2011-03-03 03.33.13.444 4 2000 Информационный БИЗНЕС … и т.д. блабла
В какой-то момент моего кода я выполняю некоторые вычисления и поиск, где я извлекаю только даты из начала каждой строки. Теперь, когда я правильно позиционируюсь в начале файла, я извлекаю только дату и время (с миллисекундами) «пример: 2011-03-03 03.33.13.444» и преобразую в объект QDateTime.
Предполагая, что мой указатель на файл правильно расположен в начале определенной строки, с помощью readLine я считываю текстовую строку datetime и преобразую в объект QDateTime
QDateTime dt;
char lineBuff[1024];
qint64 lineLength;
lineLength=file.readLine(lineBuff, 24);
dt = QDateTime::fromString(QString(lineBuff),"yyyy-MM-dd HH.mm.ss.zzz");
Это абсолютно правильно.
Но вот в чем проблема:
Когда я делаю то же самое, как это:
QDateTime dt;
QByteArray baLine;
char lineBuff[1024];
file.seek(nGotoPos); //QFile, nGotoPos = a position in my file
QString strPrev(baLine); // convert bytearry to qstring -> so i can use mid()
// calculate where the last two newline characters are in that string
int nEndLine = strPrev.lastIndexOf("n");
int nStartLine = strPrev.lastIndexOf("n", -2);
QString strMyWholeLineOfTextAtSomePoint = strPrev.mid(nStartLine,nEndLine);
QString strMyDateTime = strMyWholeLineOfTextAtSomePoint.left(24);
// strMyDateTime in debug mode shows me that it is filled with my string
// "ex: 2011-03-03 03.33.13.444"
// THE PROBLEM
// But when i try to covert that string to my QDateTime object it is empty
dt = QDateTime::fromString(strMyDateTime ,"yyyy-MM-dd HH.mm.ss.zzz");
dt.isValid() //false
dt.toString () // "" -> empty ????
НО ЕСЛИ Я СДЕЛАЮ:
dt = QDateTime::fromString(«2011-03-03 03.33.13.444″,»гггг-ММ-дд ЧЧ.мм.сс.zzz»); Тогда все в порядке.
В чем может быть проблема с моей QString? Нужно ли мне добавлять к strMyDateTime » 0″ или мне нужны какие-то другие преобразования??
Ответ №1:
Ваша строка содержит дополнительные символы, скорее всего, пробел в начале. Ваша строка формата состоит из 23 символов, и вы используете left (24), поэтому должен быть один дополнительный символ. Вы сказали в комментарии к ответу Стивена Чу, что при изменении 24 на 23 отбрасывается последний миллисекундный символ, поэтому дополнительный символ должен быть в начале.
Ответ №2:
"2011-03-03 03.33.13.444"
на самом деле имеет длину 23 символа, а не 24. Ваша извлеченная строка, вероятно, имеет дополнительный символ в конце?
Комментарии:
1. я изменил это и безуспешно. Что так отличается от readLine, в документах говорится, что он добавляет » 0″. Я не думаю, что мне нужно это делать для QString. Редактировать: когда я меняю значение на 23, я получаю символ меньше с правой стороны (отсутствует третий компонент миллисекунды)
2. Тогда у вас может быть невидимый символ в начале извлеченной строки. Я предполагаю, что это LF или CR.
3. Вы правы — у меня, вероятно, был пробел в начале, я бросил trimmed() и теперь все хорошо. Спасибо