大家好日子 我有一个简单的问题..
如何让fscanf读取整个文件?
假设我有文件settings.txt
setting1 = 1
setting2 = 2
setting3 = 3
如何将它们解析为C编程变量?
int setting1, setting2,setting3;
我试着通过简单的方式做到这一点:
fscanf(fp, "setting2 = %d\n", &setting2);
但它不能从文件中获取thw值,而这是有效的:
fscanf(fp, "setting1 = %d\n", &setting1);
是否有正确的方法来阅读整个文件?
答案 0 :(得分:3)
如何使用fgets()
阅读每一行并使用sscanf()
解析其内容,如下例所示:
https://stackoverflow.com/a/861822/1150918
? :)
另外,对于这种类型的配置,我更喜欢Lua或类似的小东西。内置语法检查,C API和小型解释器大小。
答案 1 :(得分:2)
首先,fscanf()
没有任何问题。您应该知道的第一件事是fscanf将新行字符视为空格。因此,即使您将文件视为单独的行,fscanf也会将其视为:
setting1 = 1 setting2 = 2 setting3 = 3
这不是问题,但它确实会影响您编写fscanf代码以读取此文本字符串的方式。下一个简单的方法太简单了?!
fscanf(fp, " setting1 = %d", &setting1);
fscanf(fp, " setting2 = %d", &setting2);
fscanf(fp, " setting3 = %d", &setting3);
请注意。 fscanf
的格式有一个领先的空间。这样扫描仪就可以找到无,一个或多个空格字符。如果文本文件的行具有前导空格,则除非前导空格为格式,否则将找不到匹配项。这很有道理,因为一行的开头可能有一些空格。
正确编码fscanf时,打开带有read和append的文件也有效。
让这个工作。现在,文件还有三个以上的设置吗?如果是这样,那么你的fscanf代码可能必须更复杂,但也许不是。记住,想法是读取数据,如果你的代码读取数据,那么你就完成了。
为了好玩,我尝试了以下fscanfs:
fscanf(fp, " setting1 = %i ", &setting1);
fscanf(fp, "setting2 = %i ", &setting2);
fscanf(fp, "setting3 = %i", &setting3);
请注意,格式定义中“奇怪放置的空格允许每个关键字之间有一个或多个空格。
最后一条评论。您的代码应该考虑用户拼写错误的关键字,在这种情况下fscanf会失败。因此,始终存储或测试来自fscanf的返回值:
int x;
x = fscanf(fp, " setting1 = %d", &setting1);
if (x == 0) { // keyword setting1 was misspelled...
对于当天的琐事:
x = fscanf(fp, " s e t t i n g 1 = %d", &setting1); // also works
答案 2 :(得分:1)
你想要这样的东西:
int setting[3], i;
for(i = 0; i < 3; ++i)
fscanf(fp, "setting%*d = %d\n", &setting[i]);
答案 3 :(得分:1)
char line[1024];
int setting[N],i = 0;
while(fgets(fp,line,1024) != NULL)
{
fscanf(line,"setting%*d = %d",&setting[i++]);
}
答案 4 :(得分:1)
最佳方法是将文件I / O与解析分开并处理其各自的潜在错误。 IOWs:避免fscanf()
。
void Parse(FILE *fp, int NN) {
char buf[100];
int setting[NN];
int i;
for (i = 0; i < NN; i++) {
if (fgets(buf, sizeof(buf), fp) == NULL ) {
; // Handle unexpected I/O error
}
int n, count;
unsigned u;
count = sscanf(buf, "setting%u = %d", &u, &n);
// Qualify the parse
if ((count != 2) && (u <= 0) && (u > NN)) {
; // Handle parse I/O error
}
setting[u - 1] = n;
}
}