2013-06-17 2 views
0

Как я могу найти конкретный символ в QFile, в котором есть текст?Поиск определенного символа в файле в Qt

например, у меня есть «$ 5000», написанный где-то в моем файле. чтобы найти знак «$», поэтому я пойму, что достиг числа.

Я попытался с помощью QString :: QTextStream чтения (qint64 MaxLen), поставив 1 в качестве MAXLEN:

QFile myfile("myfile.txt"); 
myfile.open(QIODevice::ReadWrite | QIODevice::Text); 

QTextStream myfile_stream(&myfile); 

    while(! myfile_stream.atEnd()) 
      { 
       if( myfile_stream.read(1) == '$') 
       { 

        qDebug()<<"found"; 
        break; 
       } 
      } 

и я получаю "ошибки: недопустимое преобразование из 'полукокса' до«сопзИте полукокс *"

Я также попытался использовать оператор [], но, по-видимому, он не может использоваться для файлов.

ответ

0

Сообщение об ошибке, которое вы опубликовали, не соответствует проблеме вашего кода. Возможно, ошибка была вызвана чем-то другим.

QTextStream::readQString. Вы не можете сравнивать QString и const char* непосредственно, но operator[] может помочь:

QString s = stream.read(1); 
if (s.count() == 1) { 
    if (s[0] == '$') { 
    //... 
    } 
} 

Однако чтение файла слишком мелкие кусочки будет очень медленным. Если ваш файл достаточно мал, вы можете прочитать все сразу:

QString s = stream.readAll(); 
int index = s.indexOf('$'); 

Если файл большой, то лучше прочитать файл с небольшими порциями (1024 байт, например) и вычислить индекс найденного персонажа с помощью indexOf результат и количество уже прочитанных фрагментов.

1

Читать в линии в то время, и искать текст, который вы читали в

QTextStream stream(&myFile); 
QString line; 
do 
{ 
    line = stream.readLine(); 
    if(line.contains("$")) 
    { 
     qDebug()<<"found"; 
     break; 
    } 
} while (!line.isNull()); 
0

один символ может быть прочитан с

QTextStream myfile_stream(&myfile); 
QChar c; 
while (!myfile_stream.atEnd()) 
    myfile_stream >> c; 
    if (c == '$') { 
    ... 
    } 
0

myfile_stream.read(1) - это не хорошая практика, вы не должны читать из файла по одному байту за раз. Либо прочитайте весь файл, либо буферизируйте/по очереди, если есть риск, что файл будет слишком большим для размещения в памяти.

Ошибка, которую вы получаете, потому что вы сравниваете QString для равенства с символьным символом - при этом не стоит говорить, что это не сработает должным образом. Строка - это строка, даже если в ней есть только один символ. Как рекомендуется - используйте либо оператор [], либо лучше для чтения - QString::at() const, который, как гарантируется, не будет создавать лишнюю копию. Вы не используете его на QFile или на QTextStream, а на QString, который возвращается из метода текстового потока, ориентированного на файл, read().

Как только у вас есть текст в памяти, вы можете использовать обычные методы QString, например indexOf(), для поиска индекса содержащегося символа.

0

in want to find the "$" sign so i will realize that I've reached the number.

Это звучит для меня, что вы ищете символ «$», потому что вы больше заинтересованы в долларовом выражении, что следует за ним. В этом случае я предлагаю читать файлы по строкам и запускать их через QRegExp, чтобы извлечь любые значения, которые вы ищете.

QRegExp dollarFind("\\$(\\d+)"); 
while(!myfile_stream.atEnd()){ 
    QString line = myfile_stream.readLine(); 
    if (dollarFind.exactMatch(line)){ 
     QStringList dollars = dollarFind.capturedTexts(); 
     qDebug() << "Dollar values found: " << dollars.join(", "); 
    } 
} 
Смежные вопросы