【问题标题】:parsing a file while reading in c在c中读取时解析文件
【发布时间】:2020-08-01 15:57:58
【问题描述】:

我正在尝试读取文件的每一行并将二进制值存储到适当的变量中。 我可以看到还有许多其他人做类似事情的例子,我花了两天时间测试我发现的不同方法,但仍然难以让我的版本根据需要工作。

我有一个txt文件,格式如下:

in = 00000000000, out = 0000000000000000
in = 00000000001, out = 0000000000001111
in = 00000000010, out = 0000000000110011
......

我正在尝试使用 fscanf 来消耗不需要的字符“in =”、“”和“out =” 并且只保留代表二进制值的字符。

我的目标是将二进制值的第一列,即“in”值存储到一个变量中 以及第二列二进制值,将“输出”值放入另一个缓冲区变量中。

我已经设法让 fscanf 使用“in”和“out”字符,但我没有 能够弄清楚如何让它消耗“,”“=”字符。此外,我认为 fscanf 应该消耗空白,但它似乎也没有这样做。

除了通用的“%d, %s, %c.....”之外,我似乎找不到任何扫描仪可用指令的完整列表,而且我似乎需要更复杂的指令组合过滤掉我试图忽略的字符,而不是我知道如何格式化。

我可以使用一些帮助来解决这个问题。我将不胜感激任何指导 提供帮助我了解如何正确过滤掉“in =”和“,out =”以及如何存储 将两列二进制字符分成两个单独的变量。

这是我目前正在使用的代码。我已经尝试使用 fgetc() 和 fscanf() 对这段代码进行其他迭代,但没有成功。

int main()
{
    FILE * f = fopen("hamming_demo.txt","r");
    char buffer[100];
    rewind(f);
    while((fscanf(f, "%s", buffer)) != EOF) {
        fscanf(f,"%[^a-z]""[^,]", buffer);
        printf("%s\n", buffer);
    }
    printf("\n");
    return 0;
}

我的代码输出如下:

 = 00000000000, 
 = 0000000000000000

 = 00000000001, 
 = 0000000000001111

 = 00000000010, 
 = 0000000000110011

感谢您的宝贵时间。

【问题讨论】:

    标签: c file parsing text-parsing


    【解决方案1】:

    所以基本上你想过滤'0''1'?在这种情况下,fgets 和一个简单的循环就足够了:只需计算 0 和 1 的数量并在末尾以空值终止字符串:

    #include <stdio.h>
    
    int main(void)
    {
        char str[50];
        char *ptr;
    
        // Replace stdin with your file
        while ((ptr = fgets(str, sizeof str, stdin)))
        {
            int count = 0;
    
            while (*ptr != '\0')
            {
                if ((*ptr >= '0') && (*ptr <= '1'))
                {
                    str[count++] = *ptr;
                }
                ptr++;
            }
            str[count] = '\0';
            puts(str);
        }
    }
    

    【讨论】:

    • 感谢您的解决方案。第一个解决方案似乎效果很好。第二种解决方案在我看来应该可以工作,但我没有得到任何输出。我添加了File * file = fopen("hamming_demo.txt", "r"); 然后将标准输入更改为文件。我正在使用 Eclipse,所以我更改 puts(str);到 printf("%s", str);我想了解为什么第二种解决方案不起作用,因为这看起来(至少部分)是我之前所做的尝试之一。
    【解决方案2】:

    scanf 系列函数被称为可怜的人的解析器,因为它对输入错误的容忍度不是很高。但是,如果您确定输入数据的格式,它允许使用简单的代码。如果格式字符串中的空格将收集所有空白字符,包括新行或无,这里唯一的魔法。你的代码可能变成:

    int main()
    {
        FILE * f = fopen("hamming_demo.txt", "r");
        if (NULL == f) {                               // always test open
            perror("Unable to open input file");
            return 1;
        }
        char in[50], out[50];                          // directly get in and out
        // BEWARE: xscanf returns the number of converted elements and never EOF
        while (fscanf(f, " in = %[01], out = %[01]", in, out) == 2) {
            printf("%s - %s\n", in, out);
        }
        printf("\n");
        return 0;
    }
    

    【讨论】:

    • 非常感谢。你能解释一下“in = %[01]”指令是如何工作的吗? “ in = ”部分看起来很简单,但 %[01] 指令让我感到困惑。有没有一个很好的资源可以让我了解这些是如何工作的?感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2010-10-13
    相关资源
    最近更新 更多