LINUX.ORG.RU

Парсинг txt файла со строками на C++

 , , ,


1

5

Приветствую. Прошу простить если вопрос слишком нубским. Имеется текстовый документ, в котором в столбик записаны строки с именем человека и его номером телефона. Нужно загружать этот список нажатием кнопки (в форме на Qt5), а другой кнопкой выводить в виджет QTextBrowser случайную строку из данного текстовика. Подскажите пожалуйста, как такое замутить?

Какие конкретно проблемы?

QFile file("file.txt")
if (!file.open(QFile::ReadOnly)) {
    return 1;
}

const QString text = file.readAll();
const auto lines = text.split('\n');

qsrand(QDateTime::currentMSecsSinceEpoch());

qDebug() << lines.at(qrand() % lines.size());

PS: код не запускал

RazrFalcon ★★★★★
()

А в чём, собственно, сложность?

XMs ★★★★★
()
Ответ на: комментарий от DELIRIUM

Это проблема C++. На расте бы он такой фигни не написал, зуб даю!

Deleted
()
Ответ на: комментарий от DELIRIUM

Kate, Gedit, Qt Creator, Notepad++, IDEA, Atom, VS Code, Sublime Text делают точно так же, так что в контексте задачи ТС это может быть вполне себе подходящее решение.

Вряд ли у него там файл больше 10МБ.

EXL ★★★★★
()
unordered_map <int, tuple<string,string>> dict;
while (fscanf("%s %s\n", &имя, &фамилия) == 2) {
  dict.insert({counter++, {имя, фамилия}});
}
set_text(get<0>(dict.begin().second), get<1>(dict.begin().second));

добавить ещё пару auto и всё заработает

anonymous
()
Ответ на: комментарий от anonymous

Мне доктор в синем халате говорил что мешать STL и Qt очень плохо и это может привести к непредвиденным последствиям.

EXL ★★★★★
()
Ответ на: комментарий от EXL

да ты шо?! никогда такого не было и вот опять! как дальше жить?

anonymous
()
Ответ на: комментарий от RazrFalcon

Преждевременная эякуляция - корень всех зол.

rupert ★★★★★
()

Открой QFile и QTextReader-ом читай из него.

iamweasel
()
Ответ на: комментарий от RazrFalcon

Проблема в том, что мне нужно выбрать случайную строку из файла, и передать её на вывод виджету QTextEdit

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Вот так взял и пару терабайт в память прочитал. Шикарное решение.

к сожалению больше 2гб не получится (

x905 ★★★★★
()
Ответ на: комментарий от RazrFalcon
mainwindow.cpp: In member function ‘void MainWindow::on_generateButton_clicked()’:
mainwindow.cpp:29:12: error: invalid use of incomplete type ‘class QDebug’
     qDebug() << lines.at(qrand() % lines.size());
            ^
In file included from /usr/include/qt4/QtCore/qnamespace.h:45:0,
                 from /usr/include/qt4/QtCore/qobjectdefs.h:45,
                 from /usr/include/qt4/QtGui/qwindowdefs.h:45,
                 from /usr/include/qt4/QtGui/qwidget.h:46,
                 from /usr/include/qt4/QtGui/qmainwindow.h:45,
                 from /usr/include/qt4/QtGui/QMainWindow:1,
                 from mainwindow.h:4,
                 from mainwindow.cpp:1:
/usr/include/qt4/QtCore/qglobal.h:1910:7: note: forward declaration of ‘class QDebug’
 class QDebug;
       ^~~~~~
/usr/include/qt4/QtCore/qglobal.h: At global scope:
/usr/include/qt4/QtCore/qglobal.h:1913:29: warning: inline function ‘QDebug qDebug()’ used but never defined
 Q_CORE_EXPORT_INLINE QDebug qDebug();


^~~~~~

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

qt4

Не надо так.

Если вы кинули TextEdit на форму в дизайнере - то:

const auto line = lines.at(qrand() % lines.size());
ui->textEdit->setPlainText(line);

А так - учите основы.

RazrFalcon ★★★★★
()
Ответ на: комментарий от EXL

Да ну. А алгоритмы, итераторы и т. д. откуда брать? Если не увлекаться исключениями и забыть про существование stl-ных строк, как про страшный сон, вполне себе мешается.

meliafaro ★★★★★
()
Ответ на: комментарий от Sunderland93

Опа. А почему qt4? Странно....пойду разбираться

Потому что вызывается qmake из тулчейна, который принадлежит Qt 4. Вызывать нужно либо qmake-qt5, либо QT_SELECT='5' qmake, либо вообще что-то ещё. Это зависит от степени упоротости мейнтейнеров дистрибутива, которые сопровождают Qt.

В современных дистрах qmake уже вызывается из Qt 5.

EXL ★★★★★
()
Ответ на: комментарий от EXL

emacs, openoffice, vim, nano туда же. Вообще, я в принципе не видел текстовых редакторов, которые делают по-другому. Даже тему когда-то на ЛОРе создавал. Таких редакторов так и не было найдено. Ну, не считая совсем урезанных вариантов вроде less и встроенного просмотрщика в mc.

next_time ★★★★★
()

Поток бетховенов от постинга новостей иссяк — пора искать работку! Вот первое тестовое задание.

utf8nowhere ★★★
()

Это что, приложение для выбора бабы на ночь, если приспичит баллоны слить?

anonymous
()
Ответ на: комментарий от meliafaro

Это где такой лихой fscanf

это не фсканф, это std::bind(::fscanf, file_descriptor, args...) Ліл :-)

anonymous
()
Ответ на: комментарий от next_time

Полной совместимости не добьются никогда, так что халат может просто повисеть на гвоздике.

cvv ★★★★★
()
Ответ на: комментарий от anonymous

это выбор службы техподдержки для исступления эмоций

anonymous
()
Ответ на: комментарий от cvv

для всех реалистичных сценариев использования уже добились

next_time ★★★★★
()
Ответ на: комментарий от bvn13

Ну хоть не много голова должна соображать, не?

Чтоб хотя бы элементарно декомпозиповать задачу, и тупо по принципу «я кодю с помощью stackoverflow» что-то накатать.

fornlr ★★★★★
()
Ответ на: комментарий от fornlr

в этом согласен, да. вопрос гуглится на раз-два

bvn13 ★★★★★
()
Ответ на: комментарий от anonymous

На использовать tuple, когда хватит pair?

anonymous
()
Ответ на: комментарий от theNamelessOne

★★★★★

Это говорит о том, что юзер трепло, а не умный.

anonymous
()
Ответ на: комментарий от DELIRIUM

Вот тоже всегда радовался такой простоте. Года 4 назад поспорили с заядлым Qt писателем о чистоте и эффективности кода, описали задачу, сели делать. Он сделал за 20 минут на Qt, я за час с хвостиком на с++11 с вставками на c. Запустили на одном тест-наборе. Мое решение выдало результат через 18 секунд, его - чрез 2 минуты вывалило «Out of memory».

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.