1

以下のコードでは、strtok を使用して、次のようなファイルからコード行を解析します。

1023.89,863.19  1001.05,861.94  996.44,945.67   1019.28,946.92  1023.89,863.19

ファイルにはさまざまな長さの行が含まれている可能性があるため、fscanf は使用しません。以下のコードは、1 つの小さな不具合を除いて機能します。これは 1 回ループしすぎて、長い空の文字列 " " を読み込んでから、再度ループして null トークン "" を認識し、while ループを終了します。なぜこれができるのかわかりません。

どんな助けでも大歓迎です。

fgets(line, sizeof(line), some_file);    
while ((line != OPC_NIL) {
    token = strtok(line, "\t"); //Pull the string apart into tokens using the commas
    input = op_prg_list_create();
    while (token != NULL) {
        test_token = strdup(token);
        if (op_prg_list_size(input) == 0)       
            op_prg_list_insert(input,test_token,OPC_LISTPOS_HEAD);  
        else
            op_prg_list_insert(input,test_token,OPC_LISTPOS_TAIL);
        token = strtok (NULL, "\t");
    }
    fgets(line, sizeof(line), some_file);                
}
4

2 に答える 2

2

区切り文字の正しいリストを使用する必要があります。あなたのコードはコメントと矛盾しています:

token = strtok(line, "\t"); //Pull the string apart into tokens using the commas

トークンをコンマで区切る場合は、","の代わりにを使用します"\t"\nさらに、トークンに改行文字(によってファイルから読み取られた各行の最後に表示される)が含まれることは確かに望ましくありませんfgets。したがって、区切り文字のリストに改行文字を追加します。

token = strtok(line, ",\n"); //Pull the string apart into tokens using the commas
...
token = strtok (NULL, ",\n");

区切り文字のリストにもスペース文字を追加することをお勧めします(863.19 1001.051つのトークンまたは2つのトークンですか?行末のスペースを削除しますか?)。

于 2013-02-07T16:25:06.877 に答える
0

を使用すると、スタック上にある固定サイズの配列であるsizeof(line)ことがわかります。lineこの場合、 に(line != OPC_NIL)なることはありませんfalse。ただし、ファイルの終わりに到達するか、その他のエラーが発生するfgets()と戻ります。NULL外側の while ループは次のように書き換える必要があります。

while(fgets(line, sizeof(line), some_file)) {
...
}

入力ファイルには、最後の入力行の末尾に改行文字が含まれている可能性が高く、末尾に単一の空白行が生じます。これはこれの違いです:

1023.89,863.19 1001.05,861.94 996.44,945.67 1019.28,946.92 1023.89,863.19↵
<blank line>

この:

1023.89,863.19 1001.05,861.94 996.44,945.67 1019.28,946.92 1023.89,863.19

while ループで最初に行うべきことは、文字列が実際に期待どおりの形式であることを確認することです。そうでない場合は、次のように中断します。

while(fgets(line, sizeof(line), some_file)) {
    if(strlen(line) == 0) // or other checks such as "contains tab characters"
        break;
    ...
}
于 2013-02-07T16:47:09.050 に答える