LINUX.ORG.RU

[QT][QFile] не могу разобраться в работе с потоками(

 


0

2

создаю вот такой класс

class MyFile
{
public:
    int k;
    QVector <QString> buf;

 void open()
 {
       k=0;

        QFile file_;
       QTextStream out;
       file_.setFileName("/home/wcd/1.txt");
       file_.open( QIODevice::ReadOnly|QIODevice::Text);

       out.setDevice(&file_);
       out.autoDetectUnicode();
       QString st;


       while(st=="break"){out>>st;buf.push_back(st);st.clear();k++;}
file_.close();
}
};

потом создавая элемент класса и используя метод open() получаю segmentation fault
пример вызова:

    MyFile fil;
    fil.open();

    MyLabel *label[10];
    for(int i=0;i<10;i++)label[i]=new MyLabel;

  


   ui->setupUi(this);
  int k=1;
   for(int i=0;i<10;i++){

       label[i]->shows(this);
 
       label[i]->label->setGeometry(QRect(220, 30+25*i, 90, 40));
       label[i]->chbox->setGeometry(QRect(200, 40+25*i, 20, 20));

       if(k<=20)
           label[i]->label->setText(fil.buf.at(1)+" в "+fil.buf.at(2));

}



Последнее исправление: tux-eda (всего исправлений: 1)

ошибка где-то в месте связанном с файло

tux-eda
() автор топика
Ответ на: комментарий от tux-eda

Чтот-о я вообще не понял что это за «шедевр», может тебе лучше сделать метод, а то и просто фуцнкцию возвращающую QStringList?

erfea ★★★★★
()

>public:

int k;

QVector <QString> buf;



Оо

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

фактически мне сейчас нужно создать класс для работой с файлом.а конкретно прочитать файл в вектор типа QString

tux-eda
() автор топика
Ответ на: комментарий от tux-eda

Почему именно вектор?! Во всех пример в Qt для этого QStringList используют. Почему ты назвал входной поток out?! Почему ты делаешь этот вектор и int k публичными да ещё и напрямую к ним обращаешься из вне?! Ты c крестами не дружишь...

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

кстати зачем тебе вообще int k?! предполагаю что валится в бесконечном цикле «while(st!=„break“){out>>st;buf.push_back(st);st.clear();k++;}», не уверен на счет поведения оператора >> на дочитаном до конца потоке.

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

назвал out,тк планировал и чтение и запись.вектор ибо я хочу прочитать файл вида lor lor lor lor break
а в публичном...просто показалось так проще.

tux-eda
() автор топика
Ответ на: комментарий от erfea

ЗЫ юзай QStringList, сделай его приватным, отдавай на него ссылку как положено методом заглушкой. И читай файло каким то другим циклом, скажем while (!out.atEnd())

erfea ★★★★★
()
Ответ на: комментарий от tux-eda

Эмм... 1: и в чём соль юзать вектор? 2: Обращаться к полям объекта на прямую есть моветон. Сделать тупую заглушку отдающую ссылку на приватное поле дело 3 секунд, пишется она прямиком в заголовочном файле.

erfea ★★★★★
()
while(st!="break"){out>>st;buf.push_back(st);st.clear();k++;}

Условие выхода никогда не выполнится. Если, конечно, st.clear() каким-нибудь образом не заносит значение «break» в строку.

И больше в одну строку составные операторы не пиши.

schizoid ★★★
()

Универсальный рецепт поиска где ошибка (не всегда работает, и не всегда верно):
1. перед '}' поставить «//*/»
2. После '{' поставить «/*»
3. Если запускается без сегфолта, удаляешь «/*», ставиш на следующей строчки.

Если много кода, можно использовать что-то типа метода деление пополам.

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

qDebug() - я использую для отладки в основном, не представляю как можно использовать для поиска где сегфолтится. (разве что написать например, написать на 10 строчке метода qDebug()<<«sucess 10 str»; на 20 - qDebug()<<«sucess 20 str»; )

ymuv ★★★★
()

[code] label->label->setGeometry(QRect(220, 30+25*i, 90, 40)); [/code] Лучше использовать контейнеры же. Для лабы-то пофиг, это так, на будущее. Где почитать - на рутракере легко ищется пара книг по запросу «Qt4».

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

На примере кода из этого треда:

void open() {
    k=0;
    QFile file_;
    QTextStream out;
    qDebug() << "1";
    file_.setFileName("/home/wcd/1.txt");
    qDebug() << "2";
    file_.open( QIODevice::ReadOnly|QIODevice::Text);
    qDebug() << "3";

    out.setDevice(&file_);
    qDebug() << "4";
    out.autoDetectUnicode();
    qDebug() << "5";
    QString st;

    qDebug() << "6";
    while (st = ="break") {
        qDebug() << "61";
        out >> st;
        qDebug() << "62";
        buf.push_back(st);
        qDebug() << "63";
        st.clear();
        qDebug() << "64";
        k++;
        qDebug() << "65";
    }
    qDebug() << "7";
    file_.close();
    qDebug() << "8";
}
Если мне не лень, то я вставляю что-то более осмысленное вроде «before file.open()».

Но вообще, пора бы мне уже осилить gdb.

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

Да, сорри.
Я не прав. Будет пустая строка. :)

zJes ★★
()

переписал класс.

class MyFile
{
public:



    int k;
    void open()
    {
        k=0;

       QFile file_;
      file_.setFileName("/home/wcd/1.txt");
       file_.open( QIODevice::ReadOnly|QIODevice::Text);

       QTextStream out;
       out.setDevice(&file_);
       out.autoDetectUnicode();
       QString st;

       while(!out.atEnd()){out>>st;
                                  buf.append(st);
                                   k++;
                                 }
       
       file_.close();
    }

QString read(int n)
{
  if(n<=k){return buf.at(k);}
}

private:
QStringList buf;
    };


segfalt все в том же месте например в этом случае

QString line=fil.read(1)+" в "+fil.read(2);

tux-eda
() автор топика
Ответ на: комментарий от zJes

QString.clear(); Типизация в крестах строгая.

erfea ★★★★★
()
Ответ на: комментарий от tux-eda
QString read(int n)
{
  if(n<=k){return buf.at(k);}
//А если n > k? И почему buf.at(_k_), вернуть то что не существует?
}

Думаю, что так будет получше?

class MyFile
{
public:
    void open()
    {
        QFile file_("/home/wcd/1.txt");
        if (!file_.open( QIODevice::ReadOnly|QIODevice::Text))
             return;

        QTextStream out(&file_);
        out.autoDetectUnicode();

        QString st;
        while(!out.atEnd()){
            out>>st;
            buf.append(st);
       }
       
       file_.close();
    }

    QString read(int n)
    {
        if(n<=buf.length()){
             return buf.at(n);
        }
        return ""; //или как будет лучше?
    }

    private:
         QStringList buf;
};
Насчет >> QString я лоханулся, причем очень жестоко, смотрел одно, думал совсем про другое.

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

Ах я вижу, там QStringList, тогда неважно. Хотя я бы наверное таки сделал readAll и split.

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

По словам читать.

З.Ы. n <= buf.length() -> n < buf.length() конечно.

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

Ну да, что-то про нее забыл, любом случае больше хотелось показать ошибку автора.

zJes ★★
()

вот за такое «while(st==„break“){out>>st;buf.push_back(st);st.clear();k++;}» надо руки отрывать, с таким подходом тебя ждет еще не мало «а чой то оно падает нипанимайу»

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от tux-eda

ВЕЩЕСТВА

>return buf.at(k);

скажи мне 1 вещь. Зачем тебе в методе read входной параметр n если ты пытаешься (с логичным сегфолтом) достать значение с индексом k?

seed_stil ★★
()

Буду первым и скажу: сегфолта тут нет.

Многие эксперты ЛОРа кажись не заметили это while(st==«break»)

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

P.S. ТС я надеюсь ты пишешь программу с закрытым исходным кодом?

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

> Универсальный рецепт поиска где ошибка

(не всегда работает, и не всегда верно)

ну ну

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

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

> Есть. Но зачем? ИМХО так быстрее.

лопатой тоже быстрее копать, пока экскаватором управлять не научишься

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

Я умею пользоватся дебагером, просто если в ф-ции/методе больше 200 строчок, намного удобнее закоментировать (скажем половину) и запустить. Если нормально, то закоментировать меньше.
Или как писал анонимус, использовать qDebug()<< .

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

> намного удобнее закоментировать (скажем половину) и запустить

намного удобнее один раз нажать сочетание клавиш для запуска программы под отладчиком и потом смотреть уже на место падения

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