C - 从格式化的文本文件中读取带有整数的字符串
C - Read string with integers from formatted text file
我有一个格式如下的文本文件:
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
我该如何解决这个问题? colorStr
、r
、g
和 b
变量已在程序的前面设置。
您的代码的问题是文本包含 space,%s
不允许。
将格式字符串更改为 %[^:]
将解决此问题。
但是,代码仍然容易受到缓冲区溢出的影响。确保您的格式字符串包含 colorStr
的最大大小以防止它:
char colorStr[100];
fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b);
您的代码使用 feof(file)
,这是不正确的。您应该将 fscanf
放入循环 header 中。这将让您在循环之前删除重复的 fscanf
调用:
while(fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b) == 4) {
printf("%s: %d %d %d\n", colorStr, r, g, b);
}
请注意前导 %
格式说明符前面的 space。它指示 fscanf
跳过上一行的结尾 spaces and/or '\n'
。
我有一个格式如下的文本文件:
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
我该如何解决这个问题? colorStr
、r
、g
和 b
变量已在程序的前面设置。
您的代码的问题是文本包含 space,%s
不允许。
将格式字符串更改为 %[^:]
将解决此问题。
但是,代码仍然容易受到缓冲区溢出的影响。确保您的格式字符串包含 colorStr
的最大大小以防止它:
char colorStr[100];
fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b);
您的代码使用 feof(file)
,这是不正确的。您应该将 fscanf
放入循环 header 中。这将让您在循环之前删除重复的 fscanf
调用:
while(fscanf(file, " %99[^:]: %d %d %d", colorStr, &r, &g, &b) == 4) {
printf("%s: %d %d %d\n", colorStr, r, g, b);
}
请注意前导 %
格式说明符前面的 space。它指示 fscanf
跳过上一行的结尾 spaces and/or '\n'
。