Это для модуля программирования 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
также обеспечивают пример набора данных –