Я хочу читать построчно текстовый файл и добавлять каждую строку в массив, я пытаюсь что-то подобное, но что-то не так с моим массивом, что?
QFile inputFile("C:\\pepoles.txt");
if (inputFile.open(QIODevice::ReadOnly))
{
QTextStream in(&inputFile);
QString pepoles[1000];
while ( !in.atEnd() )
{
QString line = in.readLine();
pepoles[] = line;
}
ui->lineEdit->setText(pepoles[0]);
}
else{
QMessageBox::critical(this, "Ouups",
"Le fichier est introuvable ou vide...");
}
inputFile.close();
}
Спасибо !
Следите за количеством строк, которые вы прочитали, и индексируйте пиполи с помощью него. Также убедитесь, что вы не превышаете емкость ваших массивов.
int lineNum = 0;
QFile inputFile("C:\\pepoles.txt");
if (inputFile.open(QIODevice::ReadOnly))
{
QTextStream in(&inputFile);
QString pepoles[1000];
while ( !in.atEnd() && lineNum < 1000)
{
QString line = in.readLine();
pepoles[lineNum++] = line;
}
Вы должны использовать QStringList
вместо QString [1000];
,
Затем вы можете добавить строку просто
peoples << line;
Теперь ваш синтаксис неверен. Вы пытаетесь назначить line
в массив или как? Вы можете назначить только line
к указанному элемент массива, как
peoples[i] = line;
Но вам лучше использовать первый подход.
Вам необходимо указать, в какую позицию вы хотите скопировать строку. Например:
pepoles[0] = line;
скопирует строку в первый элемент массива. Очевидно, вам потребуется переменная для итерации по массиву, чтобы в каждом цикле вы копировали новую строку в следующую позицию в массиве.
Вы, вероятно, должны использовать QStringList
вместо массива, чтобы сделать вещи проще и безопаснее, так что вы не будете писать случайно после конца массива. Например, вы можете определить pepoles
как это;
QStringList pepoles;
Затем каждый раз, когда вы хотите добавить новую строку в конец, вы делаете:
pepoles << line;
Вот документация QStringList
о том, как его использовать: http://doc.qt.digia.com/qt/qstringlist.html#details
Вы также можете использовать std::vector<QString>
вместо:
std::vector<QString> pepoles;
В этом случае вы вставляете строки в конце:
pepoles.push_back(line);
Следить за публикациями std::vector
Вот: http://www.cplusplus.com/reference/stl/vector
std::vector
не является частью Qt. Это обеспечивается стандартной библиотекой C ++.
Также это покажет только первую строку:
ui->lineEdit->setText(pepoles[0]);
Вы, вероятно, хотите что-то вроде этого (если pepoles является QStringList)
ui->lineEdit->setText(pepoles.join());
Метод join () создает QString, которая объединяет все элементы в списке qstringlist.
Редактировать: И, возможно, использовать что-то еще, кроме LineEdit;)
Этот вопрос действительно зависит от нескольких вещей. Что планируется для информации, которую вы абстрагируете от текстового файла. Вы хотите вывести его в другой текстовый файл, отобразить его в виджете с возможностями Text Object (например, QTextEdit, QLineEdit и т. Д.), Отправить его в базу данных, использовать для какого-то рода (например, удалить дублирующиеся записи или разделять / удалять межстрочный интервал)? Является ли текстовый файл рассматриваемым линией? Сколько символов в каждой строке, следовательно, сколько битов.
Я говорю это по многим причинам. Как мы все знаем, Qt обогащает язык C ++ Meta-Object-Compiler и обширными макросами. Возвращаясь к основам программирования на C ++ в этих макросах, переставляем текст программы до того, как компилятор ее увидит. Я обнаружил, что в Qt это звучит более правдоподобно, чем текстовые объекты и файловый ввод / вывод для отправки текстовым объектам. Еще раз это зависит от того, как вы разработали свое приложение. Лучше всего следовать советам Бьярне и «Решите, какие классы вы хотите, предоставьте полный набор операций для каждого класса, сделайте явную общность с помощью наследования. Там, где такой общности нет, достаточно абстракции данных».
Теперь, когда я сказал это, у вас могут быть ошибки во время выполнения или приложение неожиданно завершает работу / завершает работу во время или после компиляции. Это означает, что вам придется переписать программу / приложение в счетчик для вашего потока данных.
Если вам нужны данные из текстового файла, чтобы вы могли искать / сортировать текст, как алгоритм двоичного поиска, сравнение с использованием одного такого массива не будет работать. если вы хотите отобразить все имена в текстовом объекте и найти их, вам лучше создать QScrollArea и QTextEdit и добавить QTextEdit в QScrollArea, как показано ниже:
scrollArea = new QScrollArea(this);
textEdit = new QTextEdit("",this);
textEdit -> setGeometry(QRect(QPoint(150, 50), QSize(400,20000)));
scrollArea -> setGeometry(QRect(QPoint(150, 50), QSize(400,300)));
scrollArea -> setWidget(textEdit);
* ПРИМЕЧАНИЕ: вы можете установить размер длины вашего текста больше, чем размер окна! Как минимум тысяча строк по 12 шрифтов ?? Это 20000, 4 точки на север и юг, чтобы содержать границы поля.
если и scrollarea, и textedit созданы в классе родительских объектов, тогда прочитайте файл, используйте readAll вместо readLine и просто отобразите его в textEdit. Редактирование строки для тысячи строк — это просто здорово! Вам не нужно выполнять итерации, и в таком случае будет достаточно того, что вы описываете с помощью QFile :: ReadOnly. Если вы делаете то, что описано в классе родительского объекта (то есть в главном окне), где при редактировании строки создается функция void, которая читает файл и отображает его следующим образом:
textEdit->setPlainText(line);
Затем просто поместите вызов функции внизу функции mainWindow. Нет смысла создавать массив для соединения строк, как описано. Когда вы можете редактировать их гораздо проще при использовании небольших трех-пяти строчных функций, используя то, что я описал.
Если это приложение не для вашего использования и вы, возможно, захотите сделать его общедоступным: это, вероятно, потребует вычислений по функциям и абстракции данных и ввода из / в текстовые объекты после заполнения массива. В этом случае создайте контейнер QStringList и используйте алгоритм qFill, как показано ниже, после закрытия файла.
QList<QString> Lstring(lineNumbers); //line numbers is the size of strings per line
qFill(Lstring, peoples.size());
foreach(QString item, Lstring){
textObjectOfChoice -> setText();
}
Лично я предпочел бы использовать QStringList, создать логическую функцию в классе MainWindow, установленном в false (off), и в int main {}, как только приложение начнет выполнение, и, конечно, объект MainWindow или dialoge был создал вызывать разделитель точек на этом объекте и передать true через параметры, включающие загрузку файла один раз. Затем ПОСЛЕ вызова w.show (); и ДО рекурсивного возврата app.exec () вызовите ту же функцию разделителя точек, а затем передайте значение в false. ПРИМЕЧАНИЕ. Всплывающие экраны помогают в этом. Лично я поднялся до полумиллиона слов на 2,5 миллиона символов без заставки. Это может занять гораздо больше времени, в зависимости от того, сколько классов вы лично написали в приложении. Ниже приведен пример функции, которая будет вызвана:
void WordGame::fileStart(bool load){
start = load;
if (start){
QFile myfile(":/WordGame/WordGame/TheHundredGrand.txt");
if(myfile.open(QIODevice::ReadOnly | QIODevice::Text))
{
QString line;
QTextStream stream(&myfile);
int index = 0;
int length = 0;
do
{
line = stream.readLine();
arryOne[index] = line;
listOne << arryOne[index];
index++;
length++;
}while(index<109582);
stream.flush();
myfile.close();
}
}
}
В основном класс главного окна WordGame будет вызываться, как показано ниже:
bool load = true;
WordGame W;
w.fileStart (нагрузка);
w.show();
w.fileStart(!load);
return app.exec();
Это, конечно, у вас есть список слов, на который вы ссылались в исходном файле qrc.
Если вы не создадите часть загрузки файла алгоритма для выхода после вызова первого экземпляра приложения, список продолжит расширяться, повторяя себя (помните, что все приложения c / c ++, которые имеют стандартный ввод / вывод, сами по себе рекурсивны, поэтому возвращаем app.exec). Абстрагирование данных в другой список вне функции создания первого списка (это означает, что исходный список будет проанализирован), чтобы его можно было сравнить с исходным, например, Уже отвеченный, ранее отвеченный, ранее найденный и т. Д., Не самый умный ход, основанный на количестве текстовых объектов. Лучше всего просто создать еще один список ввода пользователя, а затем повторить начальный список по сравнению со списком ввода пользователя. Я бы использовал что-то вроде этого:
QStringList::iterator i3 = qFind(userInputList.begin(), userInputList.end(), word);
QStringList::iterator i2 = qFind(listOne.begin(), listOne.end(), word);
В приведенных выше итераторах можно определить, соответствуют ли записи пользователя исходным наборам данных другим
ищет против пользователей предыдущие входы.
НОТА:
Функции и или методы в C ++ или Java должны содержать не более 30 строк данных (непустые строки). Повторное абстрагирование и ввод данных из виджетов, которые имеют возможности текстовых объектов (например, lineEdit), и выполнение с ними вычислений может привести к проблемам в дальнейшем, если вы часто открываете файл, как описано. Похоже, что оператор connect должен быть в порядке после того, как операция file.closed () завершена с другой функцией. Или использование логической функции done = true; что, откровенно говоря, является лучшим способом разработки, большое надежное программное обеспечение в Qt / Cpp (или на любом другом языке) с двоичным (0 или 1) истинным или ложным завершением функции / метода. Создание файла qrc и добавление текстового файла в качестве файла также может представлять интерес в зависимости от вашего использования. Создание одноразового открытия и закрытия для заполнения вашего контейнера данных было бы выходом из основного цикла событий. Если вы используете список Qstringlist, список может непрерывно заполняться до тех пор, пока не будет выполнен дамп памяти, что приведет к сбою приложения. Чтобы избежать этого, была бы необходима дополнительная функция «list-reset», например, обратная итерация с «» в качестве нуля для каждой позиции индекса в списке. Если пользователь нажимает кнопку ввода или что-то еще, или что-то еще, что вы разрабатываете, он автоматически вызовет функцию, которая содержит объект TextStream ??
Постскриптум Если вы действительно хотели получить праведность в этом, вы могли бы сделать это действительно в старом стиле, как в 8-битном стиле, * если вы постоянно знали, каким должен быть ваш текстовый файл, и были неизменными; и создать (что это ???) массив int [97], который состоит из буквенно-цифровых символов, плюс заглавные буквы и специальные символы / знаки препинания равны одной позиции индекса массива. Например, одно целое число равно одному символу, например, [0] = a, [1] = b, [26] = A, и создайте программу для поиска букв, чтобы посчитать / отобразить положение каждого символа в каждой строке, а затем, когда у вас есть статистика для этого конкретного файла слов или текстовый файл, итерируйте массив int обратно через функцию, которая сопоставляет целое число с его входным ключом корреляции (более вероятно, через временную переменную), а затем в QStringList, который затем будет итеративно обращен к текстовому объекту, который будет отображаться в пользователь вашего приложения.