2013-09-17 2 views
1

Это для модуля программирования C новичка. Я пытаюсь прочитать текстовый файл, содержащий MAC-адреса и полученные им данные, выделить соответствующие данные (адрес и количество пакетов), скопировать адреса в массив без повторения любого из них и суммировать соответствующее количество пакетов, если встречается идентичный адрес.Пытается прочитать текстовый файл в массиве без повторов в C

Я могу прочитать файл в полном порядке и получить бит каждой строки, я хочу без проблем, но когда я пытаюсь проверить каждый адрес, прочитанный с теми, которые уже находятся в массиве, я столкнулся с проблемой. В зависимости от местоположения целого числа, подсчитывающего количество полных строк, программа либо не распознает идентичные строки, и печатает их все, как они есть в файле, либо печатает их друг над другом по адресам [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]. Если linenum заменяется адресомno в цикле for(), то идентичные строки не распознаются. Мой набор данных устроен так:

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 
+0

также обеспечивают пример набора данных –

ответ

1

Я почти уверен, что это то, что вы пытаетесь сделать. Логика добавления новой записи была неправильной. Вы добавляете только один, если вы исчерпали поиск всех текущих, а это значит, что вам нужно завершить текущий поиск перед добавлением.

Примечание: не проверено на компиляцию, но, надеюсь, вы получите эту идею.

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); 
} 
+0

Это отлично работает, как только перерыв в секунду() удаляется, в противном случае он просто печатает первую строку. Большое спасибо! Попытка upvote, но моя репутация недостаточно высока. – user2783325

+0

@ пользователь2783325 Я думаю, что вы имели в виду if-block. и да, как только он будет удален, он должен пробежать весь файл. Спасибо, что поймал это. Мне было слишком поздно писать кодировку = P. Рад, что это помогло. – WhozCraig

Смежные вопросы