1

これは初心者向けの C プログラミング単位です。MAC アドレスと受信したデータを含むテキスト ファイルを読み取り、関連データ (アドレスとパケット数) を分離し、アドレスを繰り返さずに配列にコピーし、関連するパケット数を合計しようとしています。同一のアドレスが検出されました。

ファイルを問題なく読み取ることができ、必要な各行のビットを問題なく取得できますが、読み取った各アドレスを既に配列にあるものと照合しようとすると、問題が発生します。完全な行数をカウントする整数の場所に応じて、プログラムは同一の文字列を認識できず、それらをすべてファイルにそのまま出力するか、アドレス [0] に重ねて出力し、最後の住所。私は困惑しており、これについて新鮮な目が必要です-どんな提案でも大歓迎です。

私のコードは次のとおりです。

static void readadds(char filename[])
{
FILE* packetfile = fopen(filename, "r");
FILE* datafile = fopen("packdata.txt", "w+");
// Open file from input; create temporary file to store sorted data.

char line[100];
char addresses[500][18];
int datasize[500];
int addressno = 0;
// Create storage for lines read from text file, addresses and related data.

if(packetfile != NULL)
{
    while(fgets(line, sizeof line, packetfile) != NULL)
    {
        int linenum = 0;
        char thisadd[18];
        int thisdata;
        //Create arrays to temp store data from each line

        sscanf(line, "%*s   %*s %s  %i", thisadd, &thisdata);

        for(int i = 0; i < 500; i++)
        {
            if(strcmp(thisadd, addresses[i]) == 0)
            {   //check if the address is already in the array 
                int x = datasize[i];
                datasize[i] = x + thisdata; //sum packet data if address already exists
                printf("Match!\n");
                break; 
            }
            else
            {
                strcpy(addresses[linenum], thisadd); //initialize new address
                datasize[linenum] = thisdata; //initialize assoc. data
                linenum++;
                addressno++;
                printf("Started!\n");
                break;
            }
        }
    }
    for(int i = 0; i <= addressno; i++)
        {
            printf("%s  %i\n", addresses[i], datasize[i]);
            fprintf(datafile,"%s    %i\n", addresses[i], datasize[i]);
        }
}
fclose(packetfile);
fclose(datafile);
}

このバージョンでは、アドレス [0] に印刷されます。for() ループで linenum が addressno に置き換えられた場合、同一の文字列は認識されません。私のデータセットは次のように配置されています:

1378251369.691375   84:1b:5e:a8:bf:7f   68:94:23:4b:e8:35   100
1378251374.195670   00:8e:f2:c0:13:cc   00:11:d9:20:aa:4e   397
1378251374.205047   00:8e:f2:c0:13:cc   00:11:d9:20:aa:4e   397
1378251374.551604   00:8e:f2:c0:13:cc   00:11:d9:20:aa:4e   157
1378251375.551618   84:1b:5e:a8:bf:7c   cc:3a:61:df:4b:61   37
1378251375.552697   84:1b:5e:a8:bf:7c   cc:3a:61:df:4b:61   37
1378251375.553957   84:1b:5e:a8:bf:7c   cc:3a:61:df:4b:61   37
1378251375.555332   84:1b:5e:a8:bf:7c   cc:3a:61:df:4b:61   37
4

1 に答える 1

1

これがあなたがやろうとしていることだとほぼ確信しています新しいエントリを追加するロジックが正しくありませんでした。現在のものをすべて検索し尽くした場合にのみ追加します。つまり、追加する前に現在の for-searchを終了する必要があります。

注: コンパイルはテストされていませんが、うまくいけばアイデアが得られます。

static void readadds(char filename[])
{
    // Open file from input; create temporary file to store sorted data.
    FILE* packetfile = fopen(filename, "r");
    FILE* datafile = fopen("packdata.txt", "w+");

    // Create storage for lines read from text file, addresses and related data.
    char addresses[500][18];
    int datasize[500];
    int addressno = 0;

    if (packetfile != NULL)
    {
        char line[100];
        while(fgets(line, sizeof line, packetfile) != NULL)
        {
            char thisadd[18];
            int thisdata = 0;

            //Create arrays to temp store data from each line
            if (sscanf(line, "%*s   %*s %s  %i", thisadd, &thisdata) == 2)
            {
                // try to find matching address
                for(int i = 0; i < addressno; i++)
                {
                    if(strcmp(thisadd, addresses[i]) == 0)
                    {
                        //check if the address is already in the array
                        datasize[i] += thisdata;;
                        printf("Match!\n");
                        break;
                    }
                }

                // reaching addressno means no match. so add it.
                if (i == addressno)
                {
                    printf("Started!\n");
                    strcpy(addresses[addressno], thisadd); //initialize new address
                    datasize[addressno++] = thisdata; //initialize assoc. data
                }
            }
            else
            {   // failed to parse input parameters.
                break;
            }
        }

        for(int i = 0; i <= addressno; i++)
        {
            printf("%s  %i\n", addresses[i], datasize[i]);
            fprintf(datafile,"%s    %i\n", addresses[i], datasize[i]);
        }
    }
    fclose(packetfile);
    fclose(datafile);
}
于 2013-09-17T06:36:40.953 に答える