在Qt中查找文件中的特定字符

时间:2013-06-17 12:50:34

标签: qt

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

例如我在我的文件中写了'$ 5000'。想要找到“$”符号,这样我才能意识到我已经达到了这个数字。

我尝试使用QString QTextStream :: read(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;
              }
          }

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

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

5 个答案:

答案 0 :(得分:1)

一次读一行并搜索您在

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

答案 1 :(得分: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结果和已读取块的计数来计算找到的字符的索引。

答案 2 :(得分:0)

可以使用

读取单个字符
QTextStream myfile_stream(&myfile);
QChar c;
while (!myfile_stream.atEnd())
  myfile_stream >> c;
  if (c == '$') {
    ...
  }

答案 3 :(得分:0)

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

你得到的错误是因为你将QString的等式与字符文字进行比较 - 不用说不能按预期工作。即使字符串中只有一个字符,字符串也是字符串。建议 - 使用[]运算符或更好的关闭 - QString::at() const,保证不会创建额外的副本。您不是在QFile上使用它,也不是在QTextStream上使用它,而是在针对文件的文本流的QString方法返回的read()上使用它

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

答案 4 :(得分:0)

  

想要找到“$”符号,这样我就会意识到我已经达到了   号。

听起来你正在寻找'$'符号,因为你对它后面的美元价值更感兴趣。在这种情况下,我建议逐行阅读文件并通过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(", ");
    }
}