2012-01-13 210 views
0

我有号码那样的文件:XXX是不明号码特定字符串识别与提取

XXXX


YY YYYY YYY YYYY
YYYY YYY YY YYY
ZZZ
UUU UU UUUU UUUUUU UU UUUU
UU UUU UUUUù

号码的每行和麻木数“行号”的人是未知的。 我只知道有多少“块”。 (其中一个块是一个数字后面几个号线)

我的目标是: - 提取XXXX并填写标签与它 - 记号化的“行号”成数与它

文件我矩阵的计算方法

我还有什么。 我读了一行,但不知道它是单个数字还是一行数字。

我试着用sscanf来确定是否只有一个或几个数字,但它不是确定性的。我也检查了ret的值,但sscanf总是返回数字1. 因此,不可能确定是否只有一个数字。

ret = sscanf(line, "%d"); 

我不想使用PCRE。我可以用标准的c库来制作它,但是怎么做呢?如何从字符*我可以使两种线的区别?

谢谢,对不起,我的英语:)

+0

使用循环与'strtod()'。 – fge 2012-01-13 19:39:56

+0

在linux中使用管道应该是最简单的方式 – 2012-01-13 20:19:03

+0

atoi对我来说很好,我的主要问题是用一个以上的号码区分一行和一行(因为它们不在同一个结构中) 每个“块“就像我称他们是我的过程中的迭代。 – roro 2012-01-13 21:41:27

回答

0

如果你的行分隔符是换行符(\n)和您的令牌分离器是一个空白(\s),然后在同一时间到缓冲区中读取一个字符。

一旦你点击了任何分隔符,终止缓冲区,打印它,重置缓冲区的索引,然后继续阅读下一个分隔符的文件。

下面是一些代码来做到这一点:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* 
    INT_MAX is 2147483647, and so the maximum digit 
    length is 10. We add another digit to hold a 
    null terminator. 
*/ 

static const unsigned int kMaxNumberLength = 11; 
static const char *kNumberFilename = "numbers.txt"; 

int main(int argc, char *argv[]) 
{ 
    FILE *fp = NULL; 
    char currC, buffer[kMaxNumberLength]; 
    unsigned int cIndex = 0U; 

    fp = fopen(kNumberFilename, "r"); 

    if (fp) { 
     do { 
      currC = fgetc(fp); 
      buffer[cIndex] = currC; 
      if ((currC == ' ') || (currC == '\n')) { 
       buffer[cIndex] = '\0'; /* terminate buffer */ 
       fprintf(stdout, "found number: %d\n", atoi(buffer)); 
       cIndex = 0U; 
       continue; 
      } 
      cIndex++; 
     } while (currC != EOF); 

     fclose(fp); 
    } 
    else 
     return EXIT_FAILURE; 

    return EXIT_SUCCESS; 
} 

比方说,你有以下文件numbers.txt

1234 
234 567 1 
4 5 
9 

让我们编译和运行代码:

$ gcc -Wall test.c 
$ ./a.out numbers.txt 
found number: 1234 
found number: 234 
found number: 567 
found number: 1 
found number: 4 
found number: 5 
found number: 9 
+0

这是一个有趣的方式,但我搜索的主要内容是识别文件的一行是否包含一个或多个数字 与您的示例 读取一行并获得1234,这是一个单一的数字,所以我把它放到我的选项卡中,我把每个下面的数字放入我的矩阵mat [i] [0] = 234,mat [i] [1] = 567等。 现在,我看到一个9(单行数字),所以我把它放到我的标签标签[i + 1] = 9,以下所有数字都会在mat [i + 1] [0] 等中。 特别是我想要实现的具有1个或更多数字的行之间的这种识别。 目前,我读了我所有的文件行每行。 – roro 2012-01-13 21:34:08

+0

您仍然可以使用这种方法,您只需保留增加行和单词的计数器以填充二维数组。当你点击一个空格时,你会增加字数计数器。当你打一个换行符时,你增加行计数器并重置字计数器。它只是一个额外的'unsigned int'变量和另一个'if-else'级别来判断一个字符是换行还是空格。没有太多的调整。希望这会让你开始。 – 2012-01-13 21:56:58

+0

是的,你是对的,我太专注于我的read_line函数。 无论如何, 非常感谢:) – roro 2012-01-13 22:48:19