繁体   English   中英

随机排序读取文件

[英]Read file with random ordering

我需要读取一个具有ASCII字符随机顺序的文件,并根据我得到的任何字符来执行某些操作。 我可以获取任何这些字符类型“ /”,“ *”,字符串或数字。 对于每种情况,我需要做一些不同的事情。 我认为最好的方法是从fgets开始并逐行阅读。 之后,我通常会使用sscanf,但是由于要读取的文件具有ASCII字符的随机顺序,因此我不确定如何执行此操作。 这就是我开始的。 任何想法将不胜感激。

while(fgets(buffer, 80, fp) != NULL)
{
    /*if(/)
    {
        //do something for "/" character
    }
    if(*)
    {
        //do something for "*" character
    }
    if(string)
    {
        //do something for string
    }
    if(numbers)
    {
        //do something for numbers
    }*/
    memset(buffer, 0, 80);
}

像这样的例子:

while(fgets(buffer, 80, fp) != NULL)
{
    char ch, cx = 0;
    double n;

    if(sscanf(buffer, "%c %c", &ch, &cx) == 1){
        if(ch == '/'){
            puts("/");
        } else if(ch == '*'){
            puts("*");
        }
    } else if(sscanf(buffer, "%lf %c", &n, &cx) == 1){
        puts("number");
    } else {//Check further limiting condition?
        puts("string");
    }
    memset(buffer, 0, 80);
}

您的想法正确。 解决所有这些类型问题的关键是,就像您所做的那样,将行读入缓冲区。 然后,您必须弄清楚缓冲区中的内容。 通常,大多数决定都可以对缓冲区中的第一个字符(例如+,-,/,*,... )进行。

在其他情况下,通过初始测试后,您将需要进一步处理该行(例如isdigit()isalpha() (可以简化为简单字符比较以避免函数调用))。

处理这两种情况的简单方法是,简单地将一个指针分配给缓冲区,然后使用该指针遍历缓冲区以测试,提取或传递所需的元素到处理函数。

现在,下一个挑战是循环控制。 有些测试需要整个字符串,有些则可能只关心第一个char 类似于以下内容的方法将使您能够以优美的方式处理任何行以获取所需的信息:

while(fgets(buffer, 80, fp) != NULL)
{
    char *p = buffer;
    while (*p)
    {
        if(/)
        {
            //do something for "/" character
        }
        if(*)
        {
            //do something for "*" character
        }
        if(('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z'))
        {
            // do something for string
            // handle initial char
            while (*p) {
                // handle rest of string;
                p++;
            }
            if (!*p)
                goto nextline;
        }
        if('1' <= *p && '9' <= *p)
        {
            // do something for numbers
            convert numbers with atoi() or strtol(), ....
            if (endofline)
                goto nextline;
        }
        p++;
    }
    nextline:;
    //memset(buffer, 0, 80); /* not needed */
}

除了挥舞死猫,还有更多不同的方式可以做到这一点。 由您选择适合您数据的程序控制方法。 如果您有任何问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM