次の C プロジェクトの場合、目標は、次のような行と列の長さをリストした最初の 2 行を含む 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
、データ構造の構築に使用される最初の 2 行を読み取る関数を実装していることです。
これを行うには、部分文字列を現在の行に一致させる必要があります。一致する場合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 ブロックについての私の考えは、この関数に関係する行が 2 行しかなく、両方ともファイルの先頭にあるためです。各行をスキャンして、文字列が一致するかどうかをテストするだけです。存在する場合は、null 以外の条件が実行され、それ以外の場合は他の条件が実行されます。ただし、この場合、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) が呼び出し元の関数に戻ります。