我有一个如下所示的数字文件;
003 334 556 283 294 102 586 294 ...
每个 3 位数字在一行上用空格分隔。
我想要的是能够逐位读取数字,直到它遇到空格,然后再次移动光标(这样就克服了空格)并用下一个数字重新开始循环。每个数字都将分配给数组中的一个索引。该数组将在下一个循环中被覆盖 - 这很好。
例如003
光标从文件的开头开始。读取0,分配给数组[0],读取0,分配给数组[1],读取3,分配给数组[2] ,读取空格,执行一些其他操作,然后再次开始循环。
读取文件的光标是否知道它何时碰到了空格?有没有办法用它来重新启动我的循环?我知道使用 feof
作为文件末尾,是否有类似的空白?
一旦数字全部读入数组,我还有更多事情要做,这就是为什么我希望它们采用这种格式。一旦我完成了 3 位数的数字,我想继续对下一个数字进行同样的操作,依此类推。
我希望这是有道理的!
我找不到任何可以帮助我的东西,因此我在这里询问。显然,如果已经写了答案,请给我指出那个方向!
最佳答案
我想我可能会使用:
char array[4];
while (scanf(" %1[0-9]%1[0-9]%1[0-9]", &array[0], &array[1], &array[2]) == 3)
{
/* Process array */
/* Maybe map character code to pure numbers:
array[0] -= '0'; array[1] -= '0'; array[2] -= '0';
*/
}
前导空格会跳过可选的空白(零次或多次出现空白字符 — 空白、制表符、换行符)。 %[…]
扫描设置表示法不会跳过空格(%c
和 %n
也不会;所有其他转换说明符都会跳过空格) 。扫描集确保有 3 位数字可供读取。
数组的大小需要为 4,以允许每次扫描设置为 null 终止其输出。尽管行为已明确定义,但这接近肮脏,因为需要实现来实现每个转换规范之间的序列点的效果。
唯一的反对意见可能是“它不介意输入是否为987654321
”。如果这是一个问题,那么使用:
char array[4];
char dummy;
while (scanf(" %1[0-9]%1[0-9]%1[0-9]%1[ ]", &array[0], &array[1], &array[2], &dummy) == 4)
{
…
}
这确实坚持在最后一个三元组数字之后有一个空格。如果您不介意出现换行符,请将其添加到虚拟扫描集中:%1[\n]
。它允许数字三元组之间有多个空格。如果这是一个问题,那么您需要依靠 getchar()
。但总的来说,最好是 tolerant in what you accept as input (波斯特尔定律)。
测试代码
#include <stdio.h>
int main(void)
{
char array[4];
// array[3] = 'X';
while (scanf(" %1[0-9]%1[0-9]%1[0-9]", &array[0], &array[1], &array[2]) == 3)
{
printf("0 = %c, 1 = %c, 2 = %c, 3 = %d\n", array[0], array[1], array[2], array[3]);
}
return 0;
}
示例数据(208后有一个空格):
079 857 130 962 414 287 208
示例输出:
0 = 0, 1 = 7, 2 = 9, 3 = 0
0 = 8, 1 = 5, 2 = 7, 3 = 0
0 = 1, 1 = 3, 2 = 0, 3 = 0
0 = 9, 1 = 6, 2 = 2, 3 = 0
0 = 4, 1 = 1, 2 = 4, 3 = 0
0 = 2, 1 = 8, 2 = 7, 3 = 0
0 = 2, 1 = 0, 2 = 8, 3 = 0
关于C - 从文件读取时光标 'interpret' 如何出现空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45288184/