【问题标题】:Finding a specific character in a file in Qt在 Qt 中查找文件中的特定字符
【发布时间】:2013-06-17 12:50:33
【问题描述】:

如何在 QFile 中找到包含文本的特定字符?

例如,我的文件中某处写有“$5000”。我想找到“$”符号,所以我会意识到我已经达到了这个数字。

我尝试通过将 1 作为 maxlen 来使用 QString QTextStream::read(qint64 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;
              }
          }

我得到“错误:从 'char' 到 'const char* 的无效转换”

我也尝试过使用 operator[] 但显然它不能用于文件。

【问题讨论】:

    标签: qt


    【解决方案1】:

    一次读一行,然后搜索你读过的文本

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

    【讨论】:

      【解决方案2】:

      您发布的错误消息与您的代码中的问题不匹配。错误可能是由其他原因引起的。

      QTextStream::read 返回QString。您无法直接比较 QStringconst char*,但 operator[] 可以提供帮助:

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

      但是通过太小的片段读取文件会很慢。如果您的文件足够小,您可以一次读取全部内容:

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

      如果您的文件很大,最好按小块(例如 1024 字节)读取文件,并使用 indexOf 结果和已读取块的计数来计算找到的字符的索引。

      【讨论】:

        【解决方案3】:

        可以读取单个字符

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

        【讨论】:

          【解决方案4】:

          myfile_stream.read(1) - 这不是一个好习惯,您不应该一次从文件中读取一个字节。读取整个文件,如果存在文件太大而无法放入内存的风险,则可以逐行缓冲。

          您得到的错误是因为您将 QString 与字符文字的相等性进行比较 - 不用说这不会按预期工作。一个字符串是一个字符串,即使它只有一个字符。按照建议 - 使用 [] 运算符或更好地阅读 - QString::at() const 保证不会创建额外的副本。您不会在QFileQTextStream 上使用它,而是在QString 上使用它,该QString 是从针对文件的文本流的read() 方法返回的。

          在内存中拥有文本后,您可以使用常规的QString 方法(如indexOf())来搜索包含字符的索引。

          【讨论】:

            【解决方案5】:

            我想找到“$”符号,所以我会意识到我已经到达 号码。

            在我看来,您正在搜索“$”符号,因为您对它后面的美元价值更感兴趣。在这种情况下,我建议逐行读取文件并通过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(", ");
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-08-08
              • 1970-01-01
              • 2022-01-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多