Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中尝试不重复地将文本文件读入数组_C_Arrays_Loops_Iteration_Strcmp - Fatal编程技术网

在C中尝试不重复地将文本文件读入数组

在C中尝试不重复地将文本文件读入数组,c,arrays,loops,iteration,strcmp,C,Arrays,Loops,Iteration,Strcmp,这是一个初学者的C编程单元。我试图读取一个包含MAC地址及其接收到的数据的文本文件,分离出相关数据(地址和数据包数),将地址复制到一个数组中,而不重复其中任何一个,如果遇到相同的地址,则将相关的数据包数相加 我可以很好地读取文件,并获得我想要的每一行的位,而不会出现问题,但是当我尝试将读取的每个地址与数组中已经存在的地址进行对比时,我遇到了一个问题。根据计算整行数的整数的位置,程序要么无法识别相同的字符串并按文件中的格式打印它们,要么在地址[0]中相互打印,只留下最后一个地址。我被难住了,需要一

这是一个初学者的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);
}
我几乎可以肯定这就是你想要做的。添加新条目的逻辑不正确。如果已搜索完所有当前搜索,则只能添加一个,这意味着您需要在添加之前完成当前搜索

注意:未进行编译测试,但希望您能理解

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);
}
static void readadds(字符文件名[])
{
//从输入打开文件;创建临时文件以存储已排序的数据。
FILE*packetfile=fopen(文件名为“r”);
FILE*datafile=fopen(“packdata.txt”、“w+”);
//为从文本文件、地址和相关数据中读取的行创建存储。
字符地址[500][18];
int datasize[500];
int addressno=0;
if(packetfile!=NULL)
{
字符行[100];
while(fgets(行、行大小、包文件)!=NULL)
{
添加[18];
int thisdata=0;
//创建阵列以临时存储各行中的数据
如果(sscanf(行“%*s%*s%s%i”、此添加和此数据)==2)
{
//尝试查找匹配的地址
for(int i=0;i
注意:未进行编译测试,但希望您能理解

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);
}
static void readadds(字符文件名[])
{
//从输入打开文件;创建临时文件以存储已排序的数据。
FILE*packetfile=fopen(文件名为“r”);
FILE*datafile=fopen(“packdata.txt”、“w+”);
//为从文本文件、地址和相关数据中读取的行创建存储。
字符地址[500][18];
int datasize[500];
int addressno=0;
if(packetfile!=NULL)
{
字符行[100];
while(fgets(行、行大小、包文件)!=NULL)
{
添加[18];
int thisdata=0;
//创建阵列以临时存储各行中的数据
如果(sscanf(行“%*s%*s%s%i”、此添加和此数据)==2)
{
//尝试查找匹配的地址
for(int i=0;i对于(int i=0;我还提供了一个数据集的示例也提供了一个数据集的示例这在第二个for()的中断时非常有效已删除,否则它只打印第一行。非常感谢!已尝试upvote,但我的rep不够高。@user2783325我想你的意思是if block。是的,一旦删除,它将贯穿整个文件。感谢您捕捉到这一点。对我来说,编写=P代码有点太晚了。很高兴它有帮助。一旦删除了for()的第二个中断,否则它只打印第一行。非常感谢!尝试了upvote,但我的rep不够高。@user2783325我想你的意思是if block。是的,一旦删除它,它应该贯穿整个文件。感谢你捕捉到了这一点。对我来说,编写=P代码有点太晚了。很高兴它有帮助。