我想在我的程序中做的是添加一个人(或更多),然后在转到(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;
}
答案 0 :(得分:1)
在循环中使用myfile = fopen("students.dat", "wb");
,您可以反复打开该文件。然后你写入文件,覆盖文件中的任何内容,因此该文件只包含你的上一次写入。可能(可能)你的第二次调用fopen
失败,因为“文件已被另一个进程打开”,但由于你没有检查公开呼叫的返回值,你没有注意到。
我建议您阅读fopen
来电,特别是开放模式。
至于提示(没有提供完整的解决方案):在循环之前放置打开的调用。您可能必须检查文件是否存在,并决定是截断文件还是以读/写模式打开它。同样,在循环后放置fclose
调用,因此只有在完成循环后才能将其关闭。
您还必须检查open的返回值,以了解它是否已被取代。
<小时/> 至于你写的是什么:你写了一个字符串program
,但告诉写调用它的大小为struct student
。这是不正确的。另外,要将指向数组的指针传递给函数,只需要提及数组的名称;编译器会将其转换为数组的地址,因此您不需要使用address-of运算符(&
)。
关于你的case 2:
你犯了多次打开文件的错误(并且没有检查调用是否成功)。 freopen
关闭与句柄关联的文件(该文件已关闭,因此可能会调用错误)并打开新文件。然后再次对文件调用fopen
,可能会导致错误。在case
结束时,您必须关闭该文件。