关于C中的二进制文件

时间:2016-12-21 08:45:41

标签: c

我想在我的程序中做的是添加一个人(或更多),然后在转到(2),案例2时查看使用的字节数。 我的#include“header.h”是:

struct student {
    long long int personalnumber;
    char name[20];
    char gender[20];
    char program[20];
    int age;
    char email[20];
};

我在这里做的是启动程序,单击1,写出程序要求的所有信息,也许可以添加两个学生(因此循环)。当我点击(n)程序应该回到选项。单击2时,应打印出二进制文件中使用的字节数。主要功能在这里:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "header.h"

int main()
{

    int val, age;
    long long int personalnumber, size;
    char email[20], program[20], gender[20], name[20], n;

    do
    {

        system("cls");

        printf("1:  Add\n\n");
        printf("2.  info\n\n");

        scanf("%d", &val);
        getchar();

        switch (val)
        {
        case 1:

            system("cls");
            printf("Add a new student to the database\n");

            struct student s1;

            FILE *myfile;
            myfile = fopen("students.dat", "wb");          
            if (myfile == NULL)                                     
            {
                printf("Could not open the file!\n");
                system("pause"); 
                exit(1);
            }           
            while (1)
            {
                printf("\nEnter student personalnumber: ");
                scanf("%lld", &s1.personalnumber);
                getchar();
                printf("Enter name of student: ");
                fgets(&s1.name, 20, stdin);
                printf("Enter the gender of the student: ");
                fgets(&s1.gender, 20, stdin);
                printf("Enter the Program of the student: ");
                fgets(&s1.program, 20, stdin);
                printf("Enter the Age of the student: ");
                scanf("%d", &s1.age);
                getchar();
                printf("Enter the students Email: ");
                fgets(&s1.email, 20, stdin);

                myfile = fopen("students.dat", "wb");
                fwrite(&program, sizeof(struct student), 1, myfile);

                printf("Do you wish to add more students? Enter y or n");
                n = getchar();
                getchar();

                if (n == 'n')
                {
                    break;
                }
            }
            fclose(myfile);

            system("pause");
            break;

        case 2:

            freopen("students.dat", "rb", myfile);
            system("cls");
            printf("bytes:\n\n");

            myfile = fopen("students.dat", "rb");
            fseek(myfile, 0, SEEK_END);
            size = ftell(myfile);
            rewind(myfile);
            printf("Size of file is: %lld", size);

            system("pause");

            break;
        }

    } while (val != 3);

    system("pause");
    return 0;

}

1 个答案:

答案 0 :(得分:1)

在循环中使用myfile = fopen("students.dat", "wb");,您可以反复打开该文件。然后你写入文件,覆盖文件中的任何内容,因此该文件只包含你的上一次写入。可能(可能)你的第二次调用fopen失败,因为“文件已被另一个进程打开”,但由于你没有检查公开呼叫的返回值,你没有注意到。

我建议您阅读fopen来电,特别是开放模式。

至于提示(没有提供完整的解决方案):在循环之前放置打开的调用。您可能必须检查文件是否存在,并决定是截断文件还是以读/写模式打开它。同样,在循环后放置fclose调用,因此只有在完成循环后才能将其关闭。

您还必须检查open的返回值,以了解它是否已被取代。

<小时/> 至于你写的是什么:你写了一个字符串program,但告诉写调用它的大小为struct student。这是不正确的。另外,要将指向数组的指针传递给函数,只需要提及数组的名称;编译器会将其转换为数组的地址,因此您不需要使用address-of运算符(&)。 关于你的case 2:你犯了多次打开文件的错误(并且没有检查调用是否成功)。 freopen关闭与句柄关联的文件(该文件已关闭,因此可能会调用错误)并打开新文件。然后再次对文件调用fopen,可能会导致错误。在case结束时,您必须关闭该文件。