如何解析这个未知大小的数据

时间:2016-09-27 04:40:22

标签: c++ c

我有一个包含每行说明的简单文本文件。 e.g

A 1 1
B 2 1 A
C 3 1 A
D 4 1 B C

基本语法是Letter,Num,Num,Letter(s)

我只是不知道我应该调用什么函数来解析数据,以及如何在给定的语法中解析它。我觉得有很多方法可以做到。

3 个答案:

答案 0 :(得分:0)

以下C ++示例显示了从文件读取单个字符的可能方法之一,控制行尾:

#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;

int main(void)
{
    ifstream inpFile("test.txt");
    string str;
    char c;
    while (inpFile.good()) {
        // read line from file
        getline(inpFile, str);
        // make string stream for reading small pieces of data
        istringstream is(str);
        // read data ingnoring spaces
        do
        {
            is >> c; // read a single character
            if (!is.eof()) // after successful reading
                cout << c << " "; // output this character
        } while (is.good()); // control the stream state
        cout << "[End of line]" << endl;
    }
    cout << "[End of file]" << endl;
}

此处istringstream用于处理由getline获得的单行。

is >> c中读取c值的字符后,可以检查内容,例如:

        if (!is.eof()) // after successful reading
        {
            // analyze the content
            if ( isdigit(c) )
                cout << (c - '0') << "(number) "; // output as a digit
            else
                cout << c << "(char) "; // output as a non-number
        }

注意:如果文件不能包含单个字符/数字,但不能包含数字和字词,则c的类型应该合适(例如string

答案 1 :(得分:0)

在C ++中,读取整行并从中生成一个流,然后使用>>从该流中读取。

示例:

std::ifstream file(filename);
std::string line;
while (file.getline(line))
{
    std::istringstream in(line);
    char letter;
    int number1;
    int number2;
    std::vector<char> letters;
    if (in >> letter >> number1 >> number2)
    {
        char letter2;
        while (in >> letter2)
        {
            letters.push_back(letter2);
        }
    }
}

答案 2 :(得分:0)

这是读取行的C示例,然后从头开始(使用指针)输出可读字符(代码大于32):

#include <stdio.h>
#include <ctype.h>
#define MAX_LINE_LEN 80

int main(void)
{
    FILE * inpFile = fopen("test.txt", "r");
    char buf[MAX_LINE_LEN];
    char *p;
    while (!feof(inpFile))
    {
        // read a line from file
        if (fgets(buf, MAX_LINE_LEN, inpFile) != NULL)
        {
            p = buf; // start from the beginning of line
            // reading data from string till the end
            while (*p != '\n' && *p != '\0')
            {
                // skip spaces
                while (isspace(*p) && *p != '\n') p++;
                if (*p > 32)
                {
                    // output character
                    printf("%c ", *p);
                    // move to next
                    p++;
                }
            }
        }
        printf("[End of line]\n");
    }
    printf("[End of file]\n");
    return 0;
}

要从该行中提取数字和单词,您可以执行以下操作:

        // reading data from string till the end
        while (*p != '\n' && *p != '\0')
        {
            // skip spaces
            while (isspace(*p) && *p != '\n') p++;
            if (*p > 32)
            {
                int num;
                char word[MAX_LINE_LEN];
                // trying to read number
                if (sscanf(p, "%i", &num))
                {
                    printf("%i(number) ", num);
                }
                else // read string
                {
                    sscanf(p, "%s", word);
                    printf("%s(string) ", word);
                }
                // move to next space in the simplest way
                while (*p > 32) p++;
            }
        }