我有一个如下所示的文本文件:
12345678909876543211234567890
09876543122345678900
我最终需要使用单独的堆栈将这两个值一起添加到一起,所以我想将每个数字分别推入堆栈,所以我有如下代码:
test=fopen("test.txt","r");
while (!feof(fp)) {
fscanf(test, "%1d", &number);
Push((Item)number, &num1);
}
我需要修改我的代码,以便它一次读取第一行1位,推动每个数字,然后在下一行我需要它推入另一个名为num2
的堆栈而不是正如您在当前代码中看到的那样num1
。
答案 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?