C - 使用格式化文本文件中的整数读取字符串

时间:2018-02-07 16:08:21

标签: c scanf file-read

我有一个遵循以下格式的文本文件:

Thing 1: 0 0 128
Other thing: 255 64 255
Something else: 32 32 8

我打算最终为此文件添加更多内容,但格式将保持不变。我想要做的是将冒号前的所有内容读入字符串,然后将其后的所有内容读作整数。我试过这个:

fscanf((file = fopen("colors.txt", "r")) == NULL){
    return -1;
}

fscanf("%s: %d %d %d", colorStr, &r, &g, &b);

while(!feof(file)){
    printf("%s: %d %d %d", colorStr, r, g, b);
    fscanf(file, "%s: %d %d %d", colorStr, &r, &g, &b);
}

fclose(file);

但是,我得到了这个输出:

Thing 1:: 0 0 0
0: 0 0 0
0: 0 0 0
128: 0 0 0

等等。理想情况下,输出应如下所示:

Thing 1: 0 0 128
Other thing: 255 64 255
Something else: 32 32 8

我该如何解决这个问题? colorStrrgb变量已在程序的前面设置。

1 个答案:

答案 0 :(得分:0)

代码的问题在于文本包含%s不允许的空格。

将格式字符串更改为%[^:]将解决此问题。

但是,代码仍然容易受到缓冲区溢出的影响。确保您的格式字符串包含colorStr的最大大小以防止它:

char colorStr[100];
fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b);

您的代码使用feof(file),这是不正确的。您应该将fscanf放入循环标题中。这样您就可以在循环之前删除重复的fscanf调用:

while(fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b) == 4) {
    printf("%s: %d %d %d\n", colorStr, r, g, b);
}

请注意前导%格式说明符前面的空格。它指示fscanf跳过前一行的尾随空格和/或'\n'

Demo.