读入数字,直到命中换行符

时间:2015-10-13 23:39:28

标签: c io scanf

我有一个如下所示的文本文件:

12345678909876543211234567890
09876543122345678900

我最终需要使用单独的堆栈将这两个值一起添加到一起,所以我想将每个数字分别推入堆栈,所以我有如下代码:

test=fopen("test.txt","r");
while (!feof(fp)) {
    fscanf(test, "%1d", &number);
    Push((Item)number, &num1);
}

我需要修改我的代码,以便它一次读取第一行1位,推动每个数字,然后在下一行我需要它推入另一个名为num2的堆栈而不是正如您在当前代码中看到的那样num1

1 个答案:

答案 0 :(得分:3)

你没有告诉我们堆栈类型,所以我发明了一个 - typedef名称是Stack

Stack num1, num2;
Stack *stacks[2] = { &num1, &num2 };

…initialize stacks
…open file and check that the open was successful

for (int i = 0; i < 2; i++)
{
    char line[4096];
    if (fgets(line, sizeof(line), test) == 0)
        …report unexpected EOF or other error; do not continue…
    char *digit = line;
    while (isdigit((unsigned char)*digit))
        Push((Item)(*digit++ - '0'), stacks[i]);
    if (*digit != '\n' && *digit != '\0')
        …report unexpected (non-digit) data on input; do not continue;
}

我假设Push是一个函数,而不是一个可能多次评估其第一个参数的宏。如果是这样的宏,则需要将循环体拆分为两行并添加括号,以使digit的增量与函数调用分开。

请注意,此方法的一个主要优点是,您可以使用整行数据进行错误报告,这通常比人们更容易理解,而不仅仅是能够报告半成品后留下的掉落和单调。通过scanf()循环从行读取不确定数量的字符。如果您愿意,您甚至可以在该行上使用sscanf() - 请参阅How to use sscanf() in loops?