0

如何在包含文本的 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[] 但显然它不能用于文件。

4

5 回答 5

1

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

QTextStream stream(&myFile);
QString line;
do 
{
    line = stream.readLine();
    if(line.contains("$"))
    {
        qDebug()<<"found";
        break;
    }
} while (!line.isNull());
于 2013-06-17T13:08:58.237 回答
0

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

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

将文本放入内存后,您可以使用常规QString方法indexOf(),例如搜索包含字符的索引。

于 2013-06-17T15:11:12.917 回答
0

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

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结果和已读取块的计数来计算找到的字符的索引。

于 2013-06-17T13:05:56.020 回答
0

可以读取单个字符

QTextStream myfile_stream(&myfile);
QChar c;
while (!myfile_stream.atEnd())
  myfile_stream >> c;
  if (c == '$') {
    ...
  }
于 2013-06-17T14:51:05.040 回答
0

想要找到“$”符号,所以我会意识到我已经达到了这个数字。

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