Чтение информации из файловой программы на C - PullRequest
0 голосов
/ 21 ноября 2018

Это мой код:

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

struct student
{
    char studentName[50];
    int id;
};
struct student_detail
{
    int day, month, year, grade;

    struct student information;
}stu_data;
//---------------------------------//
int main()
{
    struct student_detail stu_data[10];

    int student_no, i=0, choice=0;
    char keyword[50];

    FILE *fptr;

    printf("Add-Information(1) || Get-Information(2): ");
    scanf("%d",&choice);

    if(choice == 1){

        fptr = (fopen("userInfo.txt","ab"));

        system("CLS");
        printf("How many students would you like to add?[MAX 10]: ");
        scanf("%d",&student_no);
        system("CLS");

        for(i=0; i < student_no; i++){
            system("CLS");
            printf("Enter student#%d's name: ",i+1);
            scanf("%s", stu_data[i].information.studentName);

            printf("\nWhat is %s's studentID?: ",stu_data[i].information.studentName);
            scanf("%d",&stu_data[i].information.id);

            printf("\nWhat is %s's date of birth?(dd/mm/yy):\n",stu_data[i].information.studentName);
            scanf("%d %d %d",&stu_data[i].day, &stu_data[i].month, &stu_data[i].year);

            fwrite(&stu_data[i].information.studentName, sizeof(struct student), 1, fptr);
            fwrite(&stu_data[i].information.id, sizeof(struct student), 1, fptr);
            fwrite(&stu_data[i].day, sizeof(struct student), 1, fptr);
            fwrite(&stu_data[i].month, sizeof(struct student), 1, fptr);
            fwrite(&stu_data[i].year, sizeof(struct student), 1, fptr);
        }
        fclose(fptr);
    }
    if(choice == 2){

        fptr = (fopen("userInfo.txt","rb+"));

        system("CLS");

        printf("What students information would you like to retreive?: ");
        scanf("%s",keyword);

        fseek(fptr, sizeof(struct student), SEEK_SET);

        fread(&stu_data[i].information.studentName, sizeof(struct student), 1, fptr);
        fread(&stu_data[i].information.id, sizeof(struct student), 1, fptr);

        fread(&stu_data[i].day, sizeof(struct student), 1, fptr);
        fread(&stu_data[i].month, sizeof(struct student), 1, fptr);
        fread(&stu_data[i].year, sizeof(struct student), 1, fptr);

        printf("Name: %s",stu_data[i].information.studentName);
        printf("\nID: %d",stu_data[i].information.id);
        printf("\nDate of birth: %d/%d/%d\n\n",stu_data[i].day, stu_data[i].month, stu_data[i].year);

    system("PAUSE");

    fclose(fptr);
return 0;
    }
}  

Вход в файл выглядит так:

Имя: Райли
ID: 1
Дата рождения:01.10.2001

Когда я читаю информацию из файла, я получаю правильную информацию, но не всю, когда прочитанное в сообщении выглядит так:

Имя: y
ID: 1
Дата рождения: 10/2001/2686248

Письмо работает просто не читая (извините за отсутствие комментариев внутри программы).

1 Ответ

0 голосов
/ 22 ноября 2018

Я сомневаюсь, что вы пишете или читаете то, что вы собираетесь.

Когда вы пишете,

fwrite(&stu_data[i].information.studentName, sizeof(struct student), 1, fptr);

вы пишете 1 элемент размером sizeof(struct student) байт, начиная не с начала структуры студента, а с stu_data[i].information.studentName.Таким образом, вы получаете 50-байтовое имя, и все, что происходит, следует за ним в памяти.Если sizeof(struct student) равно 250 байтам, вы пишете бессмысленные 200 байт (в лучшем случае), а затем переходите к следующему полю.Тьфу!

Если у вас нет веских причин не делать этого, почему бы не написать всю запись сразу?Меньше кода, меньше проблем для компьютера.

fwrite(&stu_data[i], sizeof(struct student), 1, fptr);

Как правило, это то, что вы должны искать в своем коде: адрес, указанный в качестве первого параметра, должен иметь структуру данных, размер которой указан во втором.Еще лучше:

fwrite(&stu_data[i], sizeof(stu_data[i]), 1, fptr);

Тот же совет относится и к чтению.Я только укажу еще одну ошибку:

    fseek(fptr, sizeof(struct student), SEEK_SET);

Независимо от того, какой ввод предоставлен, вы стремитесь (что вы, вероятно, намереваетесь) 2-й записи: sizeof(struct student) байт от начала файла,Скорее всего, вы хотите несколько кратных этого числа, в зависимости от ввода.

Кроме того, hexdump (1) - ваш друг, особенно опция -C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...