2015-02-13 6 views
0

Я использую 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) 
+0

Прочитать файл строки за строкой очень медленно, следует прочитать весь файл в памяти (один раз или сегмент по сегменту). затем разбор строк в памяти. –

+0

Вам нужно '% s' не из-за какого-то заклинания, а потому, что это правильный указатель формата для строки, которую вы пытаетесь прочитать. Значит, использование правильного указателя формата избавлялось от нарушения доступа? Вы не сказали ... И чтобы прочитать определенную структуру из файла, вы можете использовать 'fseek' для перемещения указателя файла туда, где вы хотите, если ваши записи остаются фиксированной длиной. Просто переместите 'n * sizeof (struct StuInformation)', если вы написали их таким образом, где 'n' - номер записи, которую вы хотите прочитать. – lurker

+0

Возможно, вас заинтересует [sqlite] (http://sqlite.org/) –

ответ

0

Когда строка формата в scanf_s содержит %s или %S, функция ожидает, что другой параметр, который указывает размер строки. См. https://msdn.microsoft.com/en-us/library/w40768et.aspx.

Вместо

scanf_s("%[^\n]",std.studentNumber); 

вам нужно использовать:

scanf_s("%[^\n]",std.studentNumber, sizeof(std.studentNumber)); 

Подобные изменения должны быть другими вызовами функции.

Смежные вопросы