Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Считать из файла в массив построчно
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
thechicho
Сорри, я нуб, что в плюсах, что в кьюти. Не нашел раздела для новичков, поэтому решил что это наиболее подходящий.

Надо из текстового файла считать строки в массив, чтобы потом можно было его прогнать foreach. Я думаю нужно QStringList использовать как-то?
Буду, благодарен, если кто поделится готовым кодом для этого на Qt. Сам пока не могу пробовать, т.к. Qt уже почти два часа собирается, да невысобирается бл...
silver47
#include <QFile>
#include <QStringList>
#include <QtCore/QCoreApplication>

int main(int argc, char *argv[]){
    QFile inputFile;
    QStringList myList;
    inputFile.setFileName("myinput.file");
    inputFile.open(QIODevice::ReadOnly);

    while(!inputFile.atEnd()) myList.append(inputFile.readLine());

    inputFile.close();

   // do your work here
    return 0;
}


Код из головы, могут быть ошибки незначительные :)
thechicho
сенкс) буду пробовать)
завершилась сборка наконец-то. 5 часов!!! и все из-за того, что нужна поддержка ssl! до этого стоял sdk и я даже представить се не мог, что такая это х...а, собрать кьюти из сорсов под виндой... столько пришлось перечитать.
поставил так (если понадобится дополнительная функциональность, придется все перекомпилировать же?.. ужас же нах... 5 часов... только если на ночь ставить) )
configure -debug-and-release -openssl -I C:\OpenSSL\include -L C:\OpenSSL\lib -no-qt3support -webkit -qt-libpng -qt-libjpeg -qt-gif -qt-sql-sqlite -qt-zlib
Адекватный мануал по установке (Сборка Qt с использованием MinGW32)
Пока его нарыл, кучу других перечитал. Официальный ввел в меня в ступор просто, как новичка. Не советую по нему производить установку, зря время потеряете :vava:

кстати, еще объясните, плиз, разницу между:
-openssl | Compile in run-time OpenSSL support | This option denotes a default value and needs to be evaluated. If the evaluation succeeds, the feature is included.
-openssl-linked | Compile in linked OpenSSL support

если опция -openssl, то надо библиотеки OpenSSL (3 штуки) держать в папке с программой?
если опция --openssl-linked, то эти библиотеки будут встроены в .exe ? (типа static сборка)
silver47
Цитата
если опция --openssl-linked, то эти библиотеки будут встроены в .exe ? (типа static сборка)

Нет. Также нужны 3 dllки. В чем разница не знаю. Делал всегда --openssl-linked
thechicho
подскажите еще плиз, как мне отобразить текст на кириллице из переменной в программе правильно? иероглифы вылазят.

я ща пытаюсь так:
QString answer = reply->readAll();
ui->newEdit->append(answer);

как я понял, строки в кьюти только Utf-8, а чтобы русский текст в проге показывался - надо Windows-1251.

вот так работает:
QTextCodec *rus = QTextCodec::codecForName("Windows-1251");
QTextCodec::setCodecForTr(rus);
ui->newEdit->append(tr("фвыафод выаывфа выа "));

фвыафод выаывфа выа - это QChar получается?
если да, то с ним понятно как поступать, чтобы показывался правильно.
а как быть с переменной?..
silver47
Я бы рекомендовал в main.cpp прописать:
QTextCodec *codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);


Тогда и переменные и диалоги все нормально отображаются. Всеже, считаю, юникод более предпочтительнее.

Цитата
фвыафод выаывфа выа - это QChar получается?

Нет в Qt это будет QString
thechicho
Цитата
Нет в Qt это будет QString

static QString tr(const char *sourceText, const char *comment = 0, int n = -1);

поясните плиз, почему QString?
silver47
Упс. Прошу прощения ошибся. Пора на отдых. Для того чтобы отобразить переменную QString, достаточно следующего:
tr(QString::toAscii())
thechicho
сенкс.
но чот я запутался.
смотрите.

если сайт в кодировке utf-8, то:
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForCStrings(codec);
QByteArray answer = reply->readAll();
ui->plainTextEdit->appendPlainText(answer);
показывает норм.
если же сайт в кодировке windows-1251, то чтобы показывало русские символы, надо явно задать:
QTextCodec *codec = QTextCodec::codecForName("windows-1251");

вопрос: как отобразить страницу без этих РУЧНЫХ манипуляций.
как вариант, я вижу: распарсить charset и подставить в codecForName("charset");
но если кодировка не указана на сайте не будет работать...
тогда, можно как-то преобразовать в utf-8 все? типа:
QByteArray answer = reply->readAll();
//тут answer каким-то чудесным образом преобразуется в utf-8 (да хоть во что, главное чтобы в проге показывало русский шрифт).
ui->plainTextEdit->appendPlainText(answer);

вот как-то так. помогите кодом плиз, как это реализуется :unknown:
Snake
Делаешь в main.cpp:
  QTextCodec *codec = QTextCodec::codecForLocale();
  QTextCodec::setCodecForCStrings( codec );


А дальше:
  QString answer = codec->toUnicode( reply->readAll().toAscii() );


Что-то в этом роде.
thechicho
ошибка. как исправить?
'class QByteArray' has no member named 'toAscii'
Snake
Цитата(thechicho @ 28.9.2011, 12:49) *
ошибка. как исправить?
'class QByteArray' has no member named 'toAscii'


Поставь вместо toAscii() .data()
Snake
QString answer = codec->toUnicode( reply->readAll().data() );
thechicho
не катит, один х иероглифы :hang1:
thechicho
так еще работает:

если сайт в utf-8
QString answer = QString::fromUtf8(reply->readAll());
ui->plainTextEdit->appendPlainText(answer);

если сайт в windows-1251
QString answer = QString::fromLocal8Bit(reply->readAll());
ui->plainTextEdit->appendPlainText(answer);

хелпппп :help:
Snake
Скинь минимальный проект и на какие сайты заходил
thechicho
void MainWindow::on_pushButton_clicked()
{
    QNetworkAccessManager *qnam = new QNetworkAccessManager;
    connect(qnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(download(QNetworkReply*)));
    qnam->get(QNetworkRequest(QUrl("http://mail.ru/"))); //на майл windows-1251. с utf-8 любой сайт
}

void MainWindow::download(QNetworkReply *reply)
{
QByteArray answer = reply->readAll();
ui->plainTextEdit->appendPlainText(answer);
}
thechicho
ы, пока до такого костыля ток додумался:

QByteArray answer = reply->readAll();

QRegExp rxCharset("charset=(.+)\"");
rxCharset.setMinimal(true);
rxCharset.indexIn(answer)
QString charset = rxCharset.cap(1);

QString answerGood;

if (charset == "Windows-1251" || charset == "windows-1251") {
    answerGood = QString::fromLocal8Bit(answer);
    qDebug() << "kodirovka windows-1251";
} else if (charset == "UTF-8" || charset == "Utf-8" || charset == "utf-8") {
    answerGood = QString::fromUtf8(answer);
    qDebug() << "kodirovka utf-8";
}


как улучшить? может как-то все проще делается?
как сравнивать без учета регистра? т.е. чтобы просто писать if (charset == "utf-8) { }
silver47
if(charset.toUpper() == "UTF-8")
thechicho
сенкс.
а как улучшить можно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.