评论:
听起来您需要(a)在“做某事”行之后添加代码以处理包含星号的行(例如使用 阅读fgets()
),然后在 while、“做某事”和“咀嚼星号”周围环绕另一个循环' 重复代码直到 EOF。理想情况下,您应该在遇到 EOF 后关闭该文件。删除格式字符串中的空格也可能是明智的%d
——原因很复杂,但尾随空格会给交互式程序带来讨厌的行为。
大纲:
if (fp != NULL)
{
int c;
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
while ((c = getc(fp)) != EOF && c != '\n')
;
} while (c != EOF);
fclose(fp);
}
我不经常使用do
...while
循环,但它在这里工作正常,因为内部循环的主体没有做任何愚蠢的事情(比如假设没有有效输入)。如果有几行连续的星,代码将正常工作,在它们之间什么都不做(因为i
每次都为零)。
请注意,我不习惯fgets()
阅读星星线,但可以这样做:
if (fp != NULL)
{
char line[4096];
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
} while (fgets(line, sizeof(line), fp) != 0);
fclose(fp);
}
示例代码
无论使用上述两种解决方案中的哪一种,代码都以相同的方式处理示例数据:
#include <stdio.h>
static void do_something(int n, int *arr)
{
printf("data (%d items):", n);
for (int i = 0; i < n; i++)
printf(" %d", arr[i]);
putchar('\n');
}
int main(void)
{
int i = 0;
int temp[100];
FILE *fp = fopen("input.txt", "r");
if (fp != NULL)
{
char line[4096];
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
} while (fgets(line, sizeof(line), fp) != 0);
fclose(fp);
}
/*
{
int c;
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
while ((c = getc(fp)) != EOF && c != '\n')
;
} while (c != EOF);
fclose(fp);
}
*/
else
{
printf("Cannot open File!\n");
}
return 0;
}
输出
data (14 items): 1 2 3 4 5 6 7 3 2 4 1 6 5 7
data (6 items): 1 1 2 1 1 2