Я использую VS2013 у меня есть структура, как:C - Использование файла в качестве базы данных
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' - номер записи, которую вы хотите прочитать. – lurker
Возможно, вас заинтересует [sqlite] (http://sqlite.org/) –