对于即将推出的C项目,目标是读取一个CSV文件,前两行列出行和列长度,如
attributes: 23
lines: 1000
e,x,y,n,t,l,f,c,b,p,e,r,s,y,w,w,p,w,o,p,n,y,p
e,b,y,y,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,s,m
e,x,f,y,t,l,f,w,n,w,t,b,s,s,w,w,p,w,o,p,n,v,d
e,s,f,g,f,n,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,v,u
问题是,我不知道未来的文件输入是否具有相同的行/列长度,所以我正在实现一个determineFormat
函数来读取前两行,这些将用于建立数据结构。
为了做到这一点,我需要将子字符串与当前行匹配。如果匹配,则fscanf
用于读取行并提取长度整数。但是,此代码无效,因为整个strstr
函数在ddd中被跳过。
int lineCount, attrCount; //global variables
void determineFormats(FILE *incoming){
char *curLine= emalloc(CLINPUT);
int i;
char *ptr=NULL;
for (i=0; i<2; i++){
if (fgets(curLine, CLINPUT, incoming) != NULL){
ptr= strstr(curLine, "attrib"); //this line is skipped over
if (ptr!= NULL)
fscanf(incoming, "attributes: %d", &attrCount);
else
fscanf(incoming, "lines: %d", &lineCount);
}
}
printf("Attribute Count for the input file is: %d\n", attrCount);
printf("Line count is: %d\n", lineCount);
}
我对if / else块的想法是因为这个函数只有两行感兴趣,它们都在文件的头部,只扫描每一行并测试字符串是否匹配。如果是,则运行非空条件,否则执行另一个条件。但是,在这种情况下,strstr
函数将被跳过。
额外信息
有些评论让我回过头来仔细检查。
CLINPUT被定义为100,或大约40%再次从每行读取的字符数。
这是调用ptr= strstr(curLine, "attrib");
时ddd的输出:
0xb7eeaff0 in strstr () from /lib/libc.so.6
Single stepping until exit from function strstr,
which has no line number information.
一旦发生这种情况,行指示符将消失,从该点开始单步执行(F5)将返回调用函数。
答案 0 :(得分:2)
strstr工作得很好。问题是fscanf会读取 next 行,因为当前已经读过。
这是更正确的方法
for (i=0; i<2; i++){
if (fgets(curLine, CLINPUT, incoming) != NULL){
if (strstr(curLine, "attributes:")) {
sscanf(curLine, "attributes: %d", &attrCount);
} else if (strstr(curLine, "lines:")) {
sscanf(curLine, "lines: %d", &lineCount);
}
}
}