我正在处理的代码涉及读取带有输入的文件,其结构如下:
(spaces)name(spaces) val (whatever) \n
(spaces)name(spaces) val (whatever) \n
(spaces)name(spaces) val (whatever) \n
其中空格表示任意数量的空白。我的代码应该给出名称和值。还有另一种情况,即忽略#号之后的行中的所有内容(就像注释一样)。输出应该是:
"name: (name) value: val \n"
在大多数情况下,代码都在工作,除了它添加了额外的一行,它将在最后读取的数字上创建set name = null和val。例如我的测试文件:
a 12
b 33
#c 15
nice 6#9
输出为:
Line after: a 12
name: a value: 12 :
Line after: b 33
name: b value: 33 :
Line after: # c 15
Line after: nice 6#9
name: nice value: 6 :
Line after:
name: value: 6 : //why is this happening
代码在这里。
void readLine(char *filename)
{
FILE *pf;
char name[10000];
char value[20];
pf = fopen(filename,"r");
char line[10000];
if (pf){
while (fgets(line,sizeof(line),pf) != NULL) {
//printf("Line: %s\n",line);
printf("Line after: %s\n",line);
while(true){
int i=0;
char c=line[i]; //parse every char of the line
//assert(c==' ');
int locationS=0; //index in the name
int locationV=0; //index in the value
while((c==' ')&& i<sizeof(line)){
//look for next sequence of chars
++i;
c=line[i];
if(c=='#'){
break;
}
}
if(c=='#'){ break;}
assert(c!=' ');
while (c!=' '&&i<sizeof(line))
{
name[locationS]=c;
locationS++;
//printf("%d",locationS);
++i;
c=line[i];if(c=='#'){
break;
}
}
if(c=='#'){ break;}
assert(c==' ');
while(c==' '&&i<sizeof(line)){
//look for next sequence of chars
++i;
c=line[i];
if(c=='#'){
break;
}
}
if(c=='#'){ break;}
assert(c!=' ');
printf("\n");
while ((c!=' '&& c!='\n')&&i<sizeof(line))
{
value[locationV]=c;
locationV++;
++i;
c=line[i];if(c=='#'){
break;
}
}
printf("name: %s value: %s : \n",name,value);
memset(&name[0],sizeof(name));
memset(&value[0],sizeof(value));
break; //nothing interesting left
}
}
fclose(pf);
}else{
printf("Error in file\n");
exit(EXIT_FAILURE);
}
}