读入数字直到遇到换行符
Read in digits until a newline character is hit
我有一个如下所示的文本文件:
12345678909876543211234567890
09876543122345678900
我最终需要使用单独的堆栈将这两个值加在一起,所以我想将每个数字分别压入堆栈,所以我有如下代码:
test=fopen("test.txt","r");
while (!feof(fp)) {
fscanf(test, "%1d", &number);
Push((Item)number, &num1);
}
虽然我需要修改我的代码,以便它一次读取第一行 1 个数字,压入每个数字,然后对于下一行,我需要它压入另一个名为 num2
的堆栈而不是您在当前代码中看到的 num1
。
您没有告诉我们有关堆栈类型的信息,所以我发明了一个 — 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 != '[=10=]')
…report unexpected (non-digit) data on input; do not continue;
}
我假设 Push
是一个函数,而不是一个可能多次计算其第一个参数的宏。如果是这样的宏,需要将循环体拆分成两行,加上大括号,使digit
的增量与函数调用分开。
请注意,此方法的一个主要优点是您拥有可用于错误报告的整行数据,这通常比仅能够报告错误后遗留下来的点点滴滴更容易让人们理解scanf()
循环从行中读取了半不确定数量的字符。如果需要,您甚至可以在线上使用 sscanf()
— 请参阅 How to use sscanf()
in loops?
我有一个如下所示的文本文件:
12345678909876543211234567890
09876543122345678900
我最终需要使用单独的堆栈将这两个值加在一起,所以我想将每个数字分别压入堆栈,所以我有如下代码:
test=fopen("test.txt","r");
while (!feof(fp)) {
fscanf(test, "%1d", &number);
Push((Item)number, &num1);
}
虽然我需要修改我的代码,以便它一次读取第一行 1 个数字,压入每个数字,然后对于下一行,我需要它压入另一个名为 num2
的堆栈而不是您在当前代码中看到的 num1
。
您没有告诉我们有关堆栈类型的信息,所以我发明了一个 — 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 != '[=10=]')
…report unexpected (non-digit) data on input; do not continue;
}
我假设 Push
是一个函数,而不是一个可能多次计算其第一个参数的宏。如果是这样的宏,需要将循环体拆分成两行,加上大括号,使digit
的增量与函数调用分开。
请注意,此方法的一个主要优点是您拥有可用于错误报告的整行数据,这通常比仅能够报告错误后遗留下来的点点滴滴更容易让人们理解scanf()
循环从行中读取了半不确定数量的字符。如果需要,您甚至可以在线上使用 sscanf()
— 请参阅 How to use sscanf()
in loops?