【发布时间】:2015-02-13 16:27:31
【问题描述】:
我正在使用 VS2013 我有这样的结构:
typedef struct StuInformation
{
char studentNumber[100];
char name[50];
char sex[10];
unsigned short age;
char m_status[10];
} student;
我想一一获取用户的信息:
student std;
int RecordSize;
printf("pls insert the student number :\n");
scanf_s("%[^\n]",std.studentNumber);
printf("name : \n");
scanf_s("%[^\n]", std.name);
printf("sex : \n");
scanf_s("%[^\n]", std.sex);
printf("major : \n");
scanf_s("%[^\n]", std.major);
printf("age : \n");
scanf_s("%d", &std.age);
FILE *f;
fopen_s(&f, "student.txt", "a");
RecordSize = sizeof(std);
fseek(f, 0, SEEK_END);
fwrite(&std, RecordSize, 1, f);
fclose(f);
但似乎我的 scanf_s 错误 s 有问题: 访问违规执行位置 我把它改成
scanf_s("%[s^\n]", std.email);
因为某处写着 scanf_s 必须包含 %s ...
还有一个问题:我如何从文件中读取特定记录并将其存储为结构并将其打印给用户,例如:
printf("student name is : %s ",std.name)
【问题讨论】:
-
逐行读取文件非常慢,应该将整个文件读入内存(一次或逐段)。然后解析内存中的行。
-
您需要
%s不是因为一些咒语,而是因为这是字符串的正确格式指示符,这是您要阅读的内容。那么使用正确的格式指示符是否消除了访问冲突?您没有说...并且要从文件中读取特定结构,如果您的记录保持固定长度,您可以使用fseek将文件指针移动到您想要的位置。如果您以这种方式写出它们,只需移动n * sizeof(struct StuInformation),其中n是您要读取的记录号。 -
您可能对sqlite感兴趣