1

タブ区切り文字を持つ strtok を使用して行を分割しようとしています。私のコードと入力は次のとおりです。これらのトークンをフィールド 1、フィールド 2、フィールド 3 に格納したいと思います。

コード:

while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size.
{
    field1=strtok(line," ");
    //field1=strtok(NULL,"");
    field2=strtok(NULL," ");
    field3=strtok(NULL," ");
    if(flag != 0)
    printf("%s",field1);
    flag++;
}

入力:

315     316     0.013
315     317     0.022
316     317     0.028
316     318     0.113
316     319     0.133
318     319     0.051
320     324     0.054
321     322     0.054

私の現在の出力:(field1を印刷した場合)

315     316     0.013
315     317     0.022
316     317     0.028
316     318     0.113
316     319     0.133
318     319     0.051
320     324     0.054
321     322     0.054
4

3 に答える 3

3
while(fgets(line,80,fp1)!=NULL) //Reading each line from file to calculate the file size.
{
    char *p;

    p = strtok(line, '\t');
    int itr = 0;
    while(p != NULL) {
        if(itr == 0){  
           strcpy(field1, p);
           itr++;
        }  
        else if(itr == 1){
           strcpy(field2, p);
           itr++;
        }
        else {
           strcpy(field3, p); 
           itr = 0;
        }
    p = strtok(NULL, '\t');
    }
    printf("%s%s%s", field1, field2, field3);
    // store it in array if needed         
}
于 2012-11-30T05:51:53.070 に答える
2

ここの情報を見てください:

http://www.cplusplus.com/reference/cstring/strtok/

トークナイザーとして使用する区切り文字としてスペースを指定しましたが、文字列にスペースがありません(私にはタブのように見えます)。したがって、strtokが行うことは、最初から開始してtab( "\ t")を探すことです。文字列の最後まで行き、それを見つけませんが、最後にある\ 0を見つけます。したがって、strtokは常にトークンの前に文字列を与えるので、最初に文字列を返します。

区切り文字を「\t」に変更してから、各フィールド変数を出力します。

于 2012-11-30T05:51:32.650 に答える
2

sscanf を使用することをお勧めします。タブを区切り文字として処理します。

#include <stdio.h>
#include <stdlib.h>

int
main()
{
    char line[80], field1[32], field2[32], field3[32];
    FILE *fp;

    fp = fopen("testfile", "r");
    if (fp == NULL) {
            printf("Could not open testfile\n");
            exit(0);
    }

    while (fgets(line, sizeof(line), fp) != NULL) {
            sscanf(line, "%s%s%s", field1, field2, field3);
            printf("%s %s %s\n", field1, field2, field3);
    }

    exit(0);
}
于 2012-11-30T06:11:42.577 に答える