#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) прочитана правильно, а вторая строка — нет, потому что значение строковых переменных равно » «. И затем следующая строка помещается в неправильную переменную. Это заставляет меня думать, что с моим кодом что-то не так.