C - 从文件读取时光标 'interpret' 如何出现空格?

标签 c file-io

我有一个如下所示的数字文件;

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/

相关文章:

字符缓冲区输入超过 256 个字符

c++ - 交换两个数字而不使用临时变量

c - 在 C 中交换指针地址

c++ - 解析文件 I/O

python - 将列表从 python 保存到文本文件中

c - C中文件获取内容

c - 在内核程序中获取 root 用户 id 并与当前用户 id 进行比较

C: Linux 到 Windows:通过 TCP 发送文本文件在 Windows 端产生不精确的副本

c++ - 将文本文件读入矩阵,然后将它们相乘

c++ - 适用于 iOS 和 Android 的 C++ 文件操作