2012-01-13 3 views
0

У меня есть файл чисел, например, что: XXX являются Unknow номераСпецифическое распознавание строки и извлечение

XXXX


YY YYYY YYY YYYY
YYYY YYY YY YYY
ZZZ
УУУ UU UUUU мсмсмс UU UUUU
UU уУУ UUUU U

количество чисел в строках и онемели «номер строки» не знают. Я просто знаю, сколько «блоков» есть. (Где блок является числом с несколькими количество строк)

Мои цели: - экстракты XXXX и заполнить вкладку с ним - разметить «номер строки» в число и подам Matrice с ним

Что у меня еще есть. Я прочитал строку, но не знаю, является ли это одним номером или строкой цифр.

Я пробовал с помощью sscanf, чтобы определить, есть ли только одно число или несколько, но это не является окончательным. Я также проверил значение ret, но sscanf всегда возвращает номер 1. Таким образом, невозможно определить, существует ли больше одного числа.

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

Я не хочу использовать PCRE. Я уверен, что это можно сделать со стандартной библиотекой c, но как? Как из char * я могу сделать разницу между двумя типами линий?

Спасибо, и извините за мой английский:)

+0

Используйте цикл с 'strtod()'. – fge

+0

Использование трубок в linux должно быть самым простым способом –

+0

atoi отлично подходит для меня, моя главная проблема состоит в том, чтобы различать линию с 1 номером и строкой с несколькими раз (потому что они не идут в одной структуре) Каждый " block ", как я их называю, это итерация в моем процессе. – roro

ответ

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

Это интересный способ, но главное, что я ищу, - это узнать, содержит ли строка файла 1 или более число с вашим примером , прочитав строку и получив 1234, это единственный номер, поэтому я поместил его в свою вкладку, Я помещаю каждое следующее число в свой матричный мат [i] [0] = 234, mat [i] [1] = 567 и т. д. Теперь я вижу 9 (одно число на линии), поэтому я помещаю его в вкладку вкладки [i + 1] = 9, и все следующие цифры будут отображаться в матах [i + 1] [0] и т. Д. и особенно это признание между линиями с 1 или более номерами, которые я хочу достичь. На данный момент я читаю всю строку файла в строке. – roro

+0

Вы все равно можете использовать этот подход, вы просто держите счетчики, которые увеличивают линии и слова, чтобы заполнить двумерный массив. Когда вы нажимаете пробел, вы увеличиваете счетчик слов. Когда вы нажмете новую строку, вы увеличиваете счетчик строк и сбрасываете счетчик слов. Это всего лишь пара дополнительных переменных 'unsigned int' и еще один уровень операторов' if-else', чтобы распознать, является ли символ символом новой строки или пробелом. Там не так много, чтобы настроить. Надеюсь, вам это поможет. –

+0

Да, ты прав, я слишком сосредоточился на своей функции read_line. В любом случае, спасибо большое :) – roro

Смежные вопросы