1

次の 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) が呼び出し元の関数に戻ります。

4

1 に答える 1