我尝试读取文件并使用fscanf来获取一些值并将其存储在数组中,但是在文件中,会有一些行以“#”开头(例如#this只是一个命令),而我想要跳过它们我应该怎么做?那些包含#的行会出现在随机行中。我的代码在这里得到了一些:
//do line counts of how many lines contain parameters
while(!EOF) {
fgets(lines, 90, hi->agentFile);
count++;
if (lines[0] == '#') {
count--;
}
}
//mallocing an array of struct.
agentInfo* array = malloc(count*sizeof(agentInfo));
for (i = 0; i < count; i++) {
fscanf(hi->agentFile,"%d %d %c %s %c",&array[i].r,&array[i].c,
&array[i].agent_name,&array[i].function[80],
&array[i].func_par);
所以我需要添加一些东西,所以我可以跳过以'#'开头的行,怎么样?
答案 0 :(得分:3)
您的EOF测试错误。您还需要在fgets()
循环和fscanf()
循环之间回放文件。您需要使用fscanf()
将fgets()
循环替换为第二个sscanf()
循环来读取数据。或者您需要在读取文件时分配内存。我们暂时离开,但是:
while(fgets(lines, sizeof(lines), hi->agentFile) != EOF)
{
if (lines[0] != '#')
count++;
}
agentInfo *array = malloc(count*sizeof(agentInfo));
if (array != 0)
{
int i;
rewind(hi->agentFile);
for (i = 0; fgets(lines, sizeof(lines), hi->agentFile) != EOF && i < count; i++)
{
if (lines[0] != '#')
{
if (sscanf(lines, "%d %d %c %s %c",&array[i].r,&array[i].c,
&array[i].agent_name,&array[i].function[80],
&array[i].func_par) != 5)
...format error in non-comment line...
}
}
assert(i == count); // else someone changed the file, or ...
}
请注意,这会检查内存分配错误以及非注释行的格式错误。