Я хочу прочитать огромный текстовый файл, в котором я буду делить строки в соответствии с запятой (,) и хранить строки в массиве. Итак, как это сделать. Есть ли какой-либо класс, который выполняет действие как StringTokenizer, как в badaOS. Я попытался QFile, но не смог прочитать весь файл.Чтение текстового файла в Qt
ответ
Вы можете использовать файловые потоки.
QFile file = new QFile(hugeFile);
file.open(QIODevice.OpenModeFlag.ReadOnly);
QDataStream inputStream = new QDataStream(file);
QStringList array;
QString temp;
while(!inputStream.atEnd()) {
inputStream >> temp;
array << temp.split(";");
}
Обратите внимание, что это непроверенный (псевдо) код, надеюсь, что это поможет.
QDataStream не будет работать с текстовыми файлами. –
Что значит «не сработает»? Есть ли какая-либо ОС с истинными текстовыми файлами, а также поддерживает Qt? VMS имеет их, но не поддерживает Qt. В Unix, Linux и Windows «текст» - это просто специальная интерпретация обычных файлов. – MSalters
@MSalters, QDataStream просто не перегружает 'operator >>' для строк. Код в ответе даже не компилируется. –
QTextStream позволяет читать построчно
QFile file(hugeFile);
QStringList strings;
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file);
while (!in.atEnd()) {
strings += in.readLine().split(";");
}
}
Хорошее решение, но, как я уже упоминал ранее, это не сработает, если есть огромные линии или нет разделителей строк вообще. Я также задаюсь вопросом, почему оба ответа используют «;» в примерах, когда упоминается вопрос «,». –
Использование ";" как разделитель _de facto_ – Henrikki
Вы всегда можете прочитать часть файла:
QFile file(...);
file.read(1000); // reads no more than 1000 bytes
Или автомобиль прочитать Ваш файл построчно:
file.readLine();
, но вам придется обрабатывать случаи, когда одна строка была разделена на две части.
Если это действительно огромный файл, вы можете прочитать файл file.read (an_appro_number), а file.atEnd() - false.
Прочитайте фрагмент (с файлом file.read()), добавьте его во временный буфер строки и найдите «,» (например, с помощью метода QString contains()). Если он содержит ',', то разделите его (с помощью метода QString split()): первые части X (1000 символов могут содержать более 1 токенов) будут содержать найденные маркеры, а последний еще не является полным маркером. Поэтому переключите временную строку на последнюю часть раскола и прочитайте еще один фрагмент (пока вы не нажмете file.atEnd()) и добавите его во временный буфер. Это будет работать эффективно, если ваши жетоны не будут огромными. И не забудьте обработать последний буферный текст после того, как вы нажмете file.atEnd() :)
Или в качестве альтернативы вы можете прочитать файл по символу и проверить «,» вручную, но это всегда лучше читать более 1 символа (это более эффективно, если вы читаете больше).
Это не будет захватывать пробелы после запятой. Если это неприемлемо, не стесняйтесь оптимизировать регулярное выражение. Вероятно, вы также можете уменьшить количество включений в верхней части. Я просто был доволен. Я испытал это на файл в 1600 линии, и, казалось, справиться с этим хорошо в Qt 5,6
#include <QCoreApplication>
#include <QFile>
#include <QIODevice>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QString>
#include <QStringList>
#include <QTextStream>
int main(int argc, char * argv[])
{
QCoreApplication app(argc, argv);
QFile file("C:\\PathToFile\\bigFile.fileExt");
QStringList lines;
QStringList matches;
QString match;
file.open(QIODevice::ReadOnly | QIODevice::Text);
while(!file.atEnd())
{
lines << file.readLine();
}
file.close();
QRegularExpression regex("(^|\\s|,)\\K\\w.*?(?=(,|$))");
QRegularExpressionMatchIterator it;
foreach (QString element, lines)
{
it = regex.globalMatch(element);
while(it.hasNext())
{
QRegularExpressionMatch qre_match = it.next();
match = qre_match.captured(0);
matches << match;
}
}
return 0;
}
- 1. Qt - чтение из текстового файла
- 2. Чтение текстового файла в TextEdit Qt C++
- 3. Чтение текстового файла в QT без QFile
- 4. Чтение из большого текстового файла в массив структуры в Qt?
- 5. Чтение из текстового файла в программе Qt, запущенной при запуске
- 6. Чтение XML файла в Qt
- 7. Чтение данных текстового файла
- 8. Чтение из текстового файла
- 9. чтение текстового файла java
- 10. Чтение текстового файла
- 11. Чтение из текстового файла
- 12. PyQT Чтение текстового файла
- 13. Чтение текстового файла
- 14. Чтение текстового файла - C++
- 15. Чтение текстового файла
- 16. чтение из текстового файла
- 17. Чтение Блок текстового файла
- 18. Чтение полуструктурированного текстового файла
- 19. чтение содержимого текстового файла
- 20. Чтение частей текстового файла
- 21. Чтение текстового файла
- 22. Чтение/запись текстового файла
- 23. Чтение содержимого текстового файла
- 24. Powershell Чтение текстового файла
- 25. Чтение из текстового файла
- 26. Чтение текстового файла
- 27. Чтение текстового файла C#
- 28. Java - Чтение текстового файла
- 29. Чтение строк текстового файла
- 30. Чтение текстового файла асинхронно
ли вы рассмотреть вопрос об использовании [станд :: ifstream] (http://www.cplusplus.com/reference/iostream/ ifstream /)? – Oswald
Не читать весь файл сразу, читать его по строке –
Имеет ли этот огромный файл чрезвычайно длинные строки? Если нет, QTextStream :: readLine() и QString :: split() помогут вам. –