2013-12-10 3 views
0

Если у вас есть формат файла:Лучший способ проверить формат файла правильность

<int><space><int><space><char><space><char*><space><float><newline> 

<int><space><int><space><char><space><char*><space><float><newline> 

<int><space><int><space><char><space><char*><space><float><newline> 

так, например, файл может быть:

12 2212 A test1ok 12.0 
11 2442 B something 32.555 
17 223 D sometime1test 12.0 

Теперь, с учетом какой-то файл, как бы вы проверить, что он действительно соответствует этому формату?

Как бы вы это сделали, не используя внешние библиотеки, кроме Boost?

+1

С помощью boost или C++ 11 вы можете использовать регулярные выражения. В противном случае проанализируйте файл обычно с помощью ifstream, проверяя, установлен ли бит отказа. –

+0

Регулярные выражения предназначены для такого рода операций. Почему вы думаете, что они «причудливые вещи»? Если вам нужен молот, используйте молоток; не спрашивайте, существует ли отвертка, которая может работать как молот ... –

+0

Не приравнивайте символы 'char *' и "последовательность символов". Особенно на входе. –

ответ

1

Если вы не хотите повышения, вы можете использовать <regex> из стандартной библиотеки C++ 11. Вы можете посмотреть here, чтобы получить подробную информацию о regex.

0

При использовании регулярных выражений (либо C++ 11, либо внешняя библиотека, например, например, re2) неприменимо по какой-либо причине (производительность, отсутствие C++ 11, невозможность создания lib, политика компании в папках. ..) вы можете дать генератор лексера, например, lex/flex или re2C.
Или почему нет Ragel, что, помимо прочего, специально сделано для проверки.

Такой генератор будет принимать входные данные, которые описывают то, что вы ожидаете увидеть, и то, что вы хотите, если некоторые вещи будут видны, и преобразуйте их в исходный код (например, C или C++) без внешних зависимостей, которые компилируются конечный автомат, который будет анализировать и проверять ваш формат.

1

Если часть char* не включает пробелы, вы можете попробовать использовать sscanf и посмотреть, соответствует ли она. Что-то вроде:

#include <stdio.h> 

int main() 
{ 
    unsigned dummy1, dummy2; 
    char dummy3; 
    char dummy4[256]; 
    float dummy5; 

    const char *str = "12 2212 A test1ok 12.0\n"; 
    if (sscanf(str, "%u %u %c %s %f\n", &dummy1, &dummy2, &dummy3, dummy4, &dummy5) > 0) { 
     // Matches 
    } else { 
     // Doesn't match 
    } 
} 
Смежные вопросы