我需要编写一个C程序,该程序的 struct 为"contemant",其中包含一些参赛者的数据和以下子程序:

  1. 从键盘上读取参赛者数据的子程序.
  2. 将数据写入二进制文件的子程序.
  3. 在控制台中显示所有参赛者及其数据的子程序.
  4. 一个子程序,它在文本文件中显示所有10个任务的基本分数为30,特殊分数为50,并获得"1"(0和1是唯一选项)的所有参赛者.

我成功地完成了前三个子程序,但似乎在第四个子程序上有问题.我打开了二进制文件和文本1,然后try 从文件中读取参赛者,直到没有其他参赛者,并查看所有10个任务的基本分数是否为30、特殊分数是否为50和"1",如果是这样的话,我try 在名为"raport.txt"的文件中显示每个参赛者的姓名,但我没有任何输出. 下面是我的 struct 和我的第四个子程序:

typedef struct contestants {
    int marca;
    char special;
    char name[30];
    int category;
    char basepoints;
    char elem[10];
};
void raport()
{
    FILE* f;
    FILE* g;
    fopen_s(&g, "raport.txt", "w");
    fopen_s(&f, "contestants.dat", "rb");
    contestants a;
    while (fread(&a, sizeof(contestants), 1, f) == 1)
    {
        int ok = 1;
        if (a.marca != 0 && a.basepoints == 30 && a.special == 50)
        {
            for (int i = 0; i < 10; i++)
            {
                if (a.elem[i] == 0)
                {
                    ok = 0;
                    break;
                }
            }
        }
        if (ok == 1)
        {
            fprintf_s(g, "%s\n", a.name);
        }
    }
    fclose(f);
    fclose(g);
}

推荐答案

如果基本分数或特定值与要求不匹配,则跳过判断elem数组的循环,因此ok仍然设置为1.所以它会在这种情况下打印记录.

您应该将if (ok == 1)代码移到第一个if块中.

    while (fread(&a, sizeof(contestants), 1, f) == 1)
    {
        if (a.marca != 0 && a.basepoints == 30 && a.special == 50)
        {
            int ok = 1;
            for (int i = 0; i < 10; i++)
            {
                if (a.elem[i] == 0)
                {
                    ok = 0;
                    break;
                }
            }
            if (ok == 1)
            {
                fprintf_s(g, "%s\n", a.name);
            }
        }
    }

C++相关问答推荐

在Windows上构建无聊的SSL x64

GCC:try 使用—WError或—pedantic using pragmas

如何判断宏参数是否为C语言中的整型文字

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

为什么在此程序中必须使用Volatile关键字?

在列表中插入Int指针(C)

文件权限为0666,但即使以超级用户身份也无法打开

循环中的静态变量与块中的变量和循环

C";中的ANN运行时判断失败#2-变量outputLayer;周围的堆栈已损坏.运行后出错

通过对一个大的Malloc内存进行切片来使用Malloc的内存片

C中的char**v*char[]

如何使用calloc和snprintf

哪些C++功能可以在外部C块中使用

atoi函数最大长-长误差的再创造

如何不断地用C读取文件?

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

使用共享变量同步多线程 C 中的函数

将数组返回到链表

创建 makefile 来编译位于不同目录中的多个源文件

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?