从文件中读取输入并以C语言中的特定格式存储在数组中

从文件中读取输入并以C语言中的特定格式存储在数组中,c,arrays,file,C,Arrays,File,我想从文本文件中读取并显示一些输出 输入文件格式: 0 0 3 0 1 2 1 3 4 2 1 4 3 2 3 3 1 2 4 3 4 每行的第一位数字表示特定的一天(第0天至第4天),每行的第二位和第三位数字表示在该天相互发送消息的参与者。 我编写了以下c代码来显示每天参与的参与者: 我的示例代码: #include <stdio.h> #include <

我想从文本文件中读取并显示一些输出

输入文件格式:

0 0 3         
0 1 2         
1 3 4         
2 1 4         
3 2 3         
3 1 2         
4 3 4      
每行的第一位数字表示特定的一天(第0天至第4天),每行的第二位和第三位数字表示在该天相互发送消息的参与者。 我编写了以下c代码来显示每天参与的参与者:

我的示例代码:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define B 5 // number of days
#define A 5 // number of total actors

main()
{
    FILE *fp;
    int end = 0;
    int day1, day, i, j, k1, k2;
    int esin[A][A];
    for (i = 0; i < A; i++)  // initializing array
    {
        for (j = 0; j < A; j++)
        {
            esin[i][j] = 0;
        }
    }
    fp = fopen("test.txt", "r"); // the file contains the input
    if (fp == NULL)
    {
        printf("\nError - Cannot open the designated file\n");
    }

    while (end == 0)
    {
        fscanf(fp, "%d", &day);
        day1 = day; // day1 for comparing
        while (day1 == day)
        {
            if (feof(fp))
            {
                end = 1;
                break;
            }
            fscanf(fp, "%d %d", &k1, &k2);

            esin[k1][k2] = 1;// edge creation
            esin[k2][k1] = 1;// edge creation

            fscanf(fp, "%d", &day);
        }

        printf("\nday: %d", day1); // for printing output of a particular day
        for (i = 0; i < A; i++)
        {
            for (j = 0; j < A; j++)
            {
                if (esin[i][j] == 0)
                    continue;
                else
                    printf("\n%d and %d have an edge", i, j);
            }
        }
        for (i = 0; i < A; i++)
        {
            for (j = 0; j < A; j++)
            {
                esin[i][j] = 0;
            }
        }
    }
}
但我不明白。 我得到:

day 0
0 and 3 have an edge
1 and 2 have an edge
day 3
4 and 2 have an edge
day 4
3 and 2 have an edge
day 3
1 and 2 have an edge
day 3
4 and 2 have an edge
上面的代码有什么错误吗?我需要进行哪些修正才能获得上述类似的输出?

在这一行中

if(esin[i][j]=0)
您正在分配,但要比较:

if(esin[i][j] == 0)
在这一行

if(esin[i][j]=0)
您正在分配,但要比较:

if(esin[i][j] == 0)
  • if(esin[i][j]=0)
    更改为
    if(esin[i][j]=0)

  • 如果您这样做:

        esin[k1][k2] = 1;
        esin[k2][k1] = 1;
    
  • 第0天的输出为:

    day: 0 
    0 and 3 have an edge 
    1 and 2 have an edge 
    2 and 1 have an edge
    3 and 0 have an edge
    
    只要做
    esin[k1][k2]=1如果希望输出如下所示:

    day 0
    0 and 3 have an edge
    1 and 2 have an edge
    day 1
    3 and 4 have an edge
    day 2
    1 and 4 have an edge
    day 3
    2 and 3 have an edge
    1 and 2 have an edge
    day 4
    3 and 4 have an edge
    
    day: 0 
    0 and 3 have an edge 
    1 and 2 have an edge 
    
  • 另一个问题是,当一天发生变化时,一天被扫描两次(一个在
    内,另一个在(day1==day)
    循环外)。您可以尝试以下方法:
  • if(esin[i][j]=0)
    更改为
    if(esin[i][j]=0)

  • 如果您这样做:

        esin[k1][k2] = 1;
        esin[k2][k1] = 1;
    
  • 第0天的输出为:

    day: 0 
    0 and 3 have an edge 
    1 and 2 have an edge 
    2 and 1 have an edge
    3 and 0 have an edge
    
    只要做
    esin[k1][k2]=1如果希望输出如下所示:

    day 0
    0 and 3 have an edge
    1 and 2 have an edge
    day 1
    3 and 4 have an edge
    day 2
    1 and 4 have an edge
    day 3
    2 and 3 have an edge
    1 and 2 have an edge
    day 4
    3 and 4 have an edge
    
    day: 0 
    0 and 3 have an edge 
    1 and 2 have an edge 
    
  • 另一个问题是,当一天发生变化时,一天被扫描两次(一个在
    内,另一个在(day1==day)
    循环外)。您可以尝试以下方法:

  • 在这里,当day1!=当天您的内部循环将不会执行,但您已经读取了当天值。现在,当您对输入执行fscanf(fp、%d、&day)时,它将读取个人id(第2列) 这一切都搞砸了

    我建议做一次文件扫描和建立图表

    int a,b;
    for (int i=0; i<5; i++)
    for (int j=0; j<5; j++) 
         esin[i][j] = -1; // No edge
    while (!feof(fp)) {
         fscanf(fp, "%d %d %d", &day, &a, &b);
         esin[a][b] = day;
         esin[b][a] = day;
    }
    
    // for each day find person1,person2
    for (int i=0; i<5; i++) {
        printf("Day %d:\n", i);
        for (int p=0; p<5; p++) {
            for (int q=0; q<5; q++) {
                if(esin[p][q] == i) {
                    printf ("%d and %d have an edge\n", p, q);
                }
            }
        }
    }
    
    inta,b;
    
    对于(int i=0;i这里,您正在扫描输入中的一个日期,并检查下一行的第一个整数(即日期),当day1!=天时,您的内部循环将不会执行,但您已经读取该天值。现在,当您对输入执行fscanf(fp,“%d”,&day)时,它将读取个人id(第2列) 这一切都搞砸了

    我建议做一次文件扫描和建立图表

    int a,b;
    for (int i=0; i<5; i++)
    for (int j=0; j<5; j++) 
         esin[i][j] = -1; // No edge
    while (!feof(fp)) {
         fscanf(fp, "%d %d %d", &day, &a, &b);
         esin[a][b] = day;
         esin[b][a] = day;
    }
    
    // for each day find person1,person2
    for (int i=0; i<5; i++) {
        printf("Day %d:\n", i);
        for (int p=0; p<5; p++) {
            for (int q=0; q<5; q++) {
                if(esin[p][q] == i) {
                    printf ("%d and %d have an edge\n", p, q);
                }
            }
        }
    }
    
    inta,b;
    对于(int i=0;i您可以投反对票,但我要求您留下评论,以便我可以提高此答案的质量

    如果您只想用漂亮的英语打印输入文件,[按输入文件的相同顺序]

    此小型化代码将执行以下操作:

    #include <stdio.h>
    #include <stdlib.h>
    #define B 5 // number of days
    #define A 5 // number of total actors
    
    int main()
    {
        int day1=-1, day, k1, k2;
    
        FILE *fp= fopen("test.txt", "r"); // the file contains the input
        if (fp == NULL)
        {
            printf("\nError - Cannot open the designated file\n");
            return 0;
        }
    
        while(fscanf(fp,"%d%d%d",&day,&k1,&k2)>0)
        {
            if(day1!=day || day1==-1 )
                printf("\nday: %d", day1=day); 
            printf("\n%d and %d have an edge", k1,k2);
        }
    
        return 0;
    }
    
    #包括
    #包括
    #定义B 5//天数
    #定义总共5//个参与者
    int main()
    {
    int day1=-1,day,k1,k2;
    FILE*fp=fopen(“test.txt”,“r”);//该文件包含输入
    如果(fp==NULL)
    {
    printf(“\n错误-无法打开指定的文件\n”);
    返回0;
    }
    而(fscanf(fp、%d%d、&day、&k1和&k2)>0)
    {
    如果(第1天!=第| |天1==-1)
    printf(“\n日期:%d”,第1天=天);
    printf(“\n%d和%d有一条边”,k1,k2);
    }
    返回0;
    }
    
    但是如果你真的想为每一天存储输入,然后以字典的方式打印它[演员编号的升序],那么下面是你修改过的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #define B 5 // number of days
    #define A 5 // number of total actors
    
    int main()
    {
        int day1=-1, day, i, j, k1, k2;
        int esin[A][A]={0};
    
        FILE *fp= fopen("test.txt", "r"); // the file contains the input
        if (fp == NULL)
        {
            printf("\nError - Cannot open the designated file\n");
            return 0;
        }
    
        while(!feof(fp))
        {
            if( fscanf(fp,"%d%d%d",&day,&k1,&k2)<0  || (day1!=-1 && day1!=day ))
            {
                printf("\nday: %d", day1<0?day:day1); 
                for(i=0;i<A;i++)
                    for(j=0;j<A;esin[i][j]=0,j++)
                        if(esin[i][j])
                            printf("\n%d and %d have an edge", i, j);   
                esin[k1][k2]=1;
                day1=day;
            }
            if(day1==-1)
                day1=day;
            esin[k1][k2]=1;
        }
    
        return 0;   
    }
    
    #包括
    #包括
    #定义B 5//天数
    #定义总共5//个参与者
    int main()
    {
    int day1=-1,day,i,j,k1,k2;
    int-esin[A][A]={0};
    FILE*fp=fopen(“test.txt”,“r”);//该文件包含输入
    如果(fp==NULL)
    {
    printf(“\n错误-无法打开指定的文件\n”);
    返回0;
    }
    而(!feof(fp))
    {
    如果(fscanf(fp,%d%d“,&day,&k1,&k2)您可以否决投票,但我要求您留下评论,以便我可以提高此答案的质量

    如果您只想用漂亮的英语打印输入文件,[按输入文件的相同顺序]

    此小型化代码将执行以下操作:

    #include <stdio.h>
    #include <stdlib.h>
    #define B 5 // number of days
    #define A 5 // number of total actors
    
    int main()
    {
        int day1=-1, day, k1, k2;
    
        FILE *fp= fopen("test.txt", "r"); // the file contains the input
        if (fp == NULL)
        {
            printf("\nError - Cannot open the designated file\n");
            return 0;
        }
    
        while(fscanf(fp,"%d%d%d",&day,&k1,&k2)>0)
        {
            if(day1!=day || day1==-1 )
                printf("\nday: %d", day1=day); 
            printf("\n%d and %d have an edge", k1,k2);
        }
    
        return 0;
    }
    
    #包括
    #包括
    #定义B 5//天数
    #定义总共5//个参与者
    int main()
    {
    int day1=-1,day,k1,k2;
    FILE*fp=fopen(“test.txt”,“r”);//该文件包含输入
    如果(fp==NULL)
    {
    printf(“\n错误-无法打开指定的文件\n”);
    返回0;
    }
    而(fscanf(fp、%d%d、&day、&k1和&k2)>0)
    {
    如果(第1天!=第| |天1==-1)
    printf(“\n日期:%d”,第1天=天);
    printf(“\n%d和%d有一条边”,k1,k2);
    }
    返回0;
    }
    
    但是如果你真的想为每一天存储输入,然后以字典的方式打印它[演员编号的升序],那么下面是你修改过的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #define B 5 // number of days
    #define A 5 // number of total actors
    
    int main()
    {
        int day1=-1, day, i, j, k1, k2;
        int esin[A][A]={0};
    
        FILE *fp= fopen("test.txt", "r"); // the file contains the input
        if (fp == NULL)
        {
            printf("\nError - Cannot open the designated file\n");
            return 0;
        }
    
        while(!feof(fp))
        {
            if( fscanf(fp,"%d%d%d",&day,&k1,&k2)<0  || (day1!=-1 && day1!=day ))
            {
                printf("\nday: %d", day1<0?day:day1); 
                for(i=0;i<A;i++)
                    for(j=0;j<A;esin[i][j]=0,j++)
                        if(esin[i][j])
                            printf("\n%d and %d have an edge", i, j);   
                esin[k1][k2]=1;
                day1=day;
            }
            if(day1==-1)
                day1=day;
            esin[k1][k2]=1;
        }
    
        return 0;   
    }
    
    #包括
    #包括
    #定义B 5//天数
    #定义总共5//个参与者
    int main()
    {
    int day1=-1,day,i,j,k1,k2;
    int-esin[A][A]={0};
    FILE*fp=fopen(“test.txt”,“r”);//该文件包含输入
    如果(fp==NULL)
    {
    printf(“\n错误-无法打开指定的文件\n”);
    返回0;
    }
    而(!feof(fp))
    {
    
    如果(fscanf(fp,%d%d,&day,&k1,&k2)我只想在esin[I][j]=1时打印。这意味着在第一次迭代中退出循环的参与者I和j@Alter之间有n个活动
    if(esin[I][j]=0)continue;
    因为条件始终为true。这是一个键入错误。但我仍然得到错误的输出@Alter mann我只想在esin[I][j]=1时打印。这意味着在第一次迭代中退出循环的参与者I和j@Alter mann之间有n个活动
    if(esin[I][j]=0)继续;
    因为条件始终为真。这是一个输入错误。但我仍然得到了错误的输出@Alter mann请不要垃圾标记您的问题请参阅讨论该习惯用法。您的代码将