Для запуска проекта 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% снова количеством символов для чтения из каждой строки.
Это вывод ddd при вызове ptr= strstr(curLine, "attrib");
:
0xb7eeaff0 in strstr () from /lib/libc.so.6
Single stepping until exit from function strstr,
which has no line number information.
Как только это происходит, индикатор линии исчезает, и одиночный шаг (F5) из этой точки возвращается к вызывающей функции.