Должен ли я переписать функцию, чтобы она работала в QT?

#c #windows #qt

#c #Windows #qt

Вопрос:

У меня есть две функции: одна, которая сохраняет содержимое моего массива в текстовый файл, и функция, которая считывает то же самое в массив. Все было написано в VS, и теперь я пытаюсь создать графический интерфейс для своего приложения. Моя функция сохранения в файл работает как по волшебству, но когда я пытаюсь прочитать этот файл в QT с помощью моей функции чтения, ничего не происходит. Должен ли я переписать функцию, чтобы она работала в QT? если нет, в чем может быть проблема? Что я могу «выбросить», если в.fail()?

  void DH::read()
{

    ifstream in("text.txt");
    string strKcal=" ";
    int kcal=0;
    string strCarb=" ";
    double carb=0.0;
    string strProtein=" ";
    double protein=0.0;
    string strLipid=" ";
    double lipid=0.0;
    string name;
    string usrName;
    string usrName1;
    string usrName2;
    string date;
    string nrs;
    getline(in,nrs);
    this->nrOfDiets=atoi(nrs.c_str());


    if(!in.fail())
    {
        for(int i=0;i<this->nrOfDiets amp;amp; in.good();i  )
        {
            getline(in,usrName1,' ');
            getline(in,usrName2);
            usrName=usrName1  " "   usrName2;
            getline(in,date);
            getline(in,name,'t');
            getline(in,strKcal,'t');
            getline(in,strCarb,'t');
            getline(in,strProtein,'t');
            getline(in,strLipid);


            kcal=atoi(strKcal.c_str());
            carb=atoi(strCarb.c_str());
            protein=atoi(strProtein.c_str());
            lipid=atoi(strLipid.c_str());


            this->dh[i]=new Diet(name,kcal,protein,carb,lipid,usrName,date);

        }
    }
    else
        //cout<<"Error!"<<endl;

    in.close();
}
  

Я знаю, что мог бы постоянно использовать in>> вместо getline, но по какой-то причине это не сработало : S

Комментарии:

1. Если ничего не произойдет, чего вы ожидаете? Вам следует попробовать обрабатывать свои данные по мере их чтения, чтобы убедиться, что это то, что вы ожидаете.

2. Пожалуйста , научитесь заключать в скобки else предложение в вашем операторе if. Закомментировав эту "Error!" строку, вы ввели ошибку, из-за которой ваш входной поток in не закрывается, если нет ошибки.

3. @Greg: на самом деле in будет автоматически закрыт при выходе из области. Вызывает ее деструктор close() .

4. @Alexandre: Хорошая мысль, в данном конкретном случае это на самом деле не проблема. Но это все еще плохой стиль.

5. @Greg: плохой стиль здесь заключается в явном вызове close для fstream объекта.

Ответ №1:

Как правило, нет, вам не нужно ничего делать по-другому, чтобы корректный код работал как часть приложения Qt. Я не изучал ваш код подробно, но, по крайней мере, на первый взгляд, он кажется прекрасным.

Однако есть некоторые вещи, которые будут отличаться. Прежде всего, управление в графических программах обычно осуществляется из командной строки. Вы не собираетесь писать поток программы явно. Вместо этого вы будете реагировать на события (нажатия кнопок, пункты меню и т.д.). Во-вторых, вы обычно запускаете их с помощью какого-либо другого метода запуска (щелчок по значку или запуск из IDE), который может изменять такие вещи, как текущий рабочий каталог программы.

Без дополнительной информации мы не можем сказать вам, в чем заключается ваша проблема. Но я бы проверил, что программа на самом деле запущена из каталога, где указан относительный путь «text.txt » ссылается на действительный файл. Кроме того, и это может показаться безумием, но убедитесь, что ваш код действительно вызывается.

Кстати, ваше последнее предложение о operator>> vs. getline … иногда неплохо просто перейти к чему-то, что работает, но вам, вероятно, было бы полезно потратить время на то, чтобы разобраться в подобных вещах, когда вы сможете. Выяснение того, почему что-то не работает так, как вы думали, часто может сэкономить вам огромное количество времени и разочарований позже.

Комментарии:

1. У меня есть тот же путь сохранения. Сначала я попытался добавить свою функцию read() в cunstructor графического интерфейса, так что после сборки графического интерфейса файл будет прочитан. Затем я попытался добавить кнопку в свой графический интерфейс, при нажатии на которую файл должен быть прочитан.

2. Это может «должно быть», но, по-видимому, это не так. Вам нужно выполнить некоторую базовую отладку, чтобы исследовать проблему. Сбой конструктора ifstream? Вызывается ли функция (возможно, вы поместили вызов в неправильный конструктор, вызов connect(), который подключил обработчик нажатия кнопки, может быть неправильным и т.д.). Все, что я знаю, чтобы сказать вам, — это ввести несколько инструкций для ведения журнала и посмотреть, что произойдет.

3. Я поместил точку останова внутри функции, чтобы посмотреть, начнется ли чтение, и это происходит. Но когда я проверяю «locals и Watchers», это показывает, что первая строка (int) прочитана правильно, а вторая строка — нет, потому что значение строковых переменных равно » «. И затем следующая строка помещается в неправильную переменную. Это заставляет меня думать, что с моим кодом что-то не так.