C prog: запись в и из бинарных файлов не работает? - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть вопрос, касающийся программирования на языке Си. Это касается двоичных файлов. В своем коде я (по крайней мере, предположил, что я) сделал его чтение и запись из двоичного файла, но по какой-то причине он этого не сделаетЯ пытался изменить некоторые вещи, но я просто нигде не вижу ошибки. И именно эта минимальная деталь доставляет мне много времени, это все, что остается сделать в этом коде, прежде чем это сделать, изатем я закончил с программой в целом, так что она действует мне на нервы немного больше, чем обычно. Пожалуйста, укажите, что я не сделал и что я должен сделать, чтобы она читала и записывала в двоичные файлыправильно:

 #define MAX 4

//========================-STRUCTURE-=====================================================================

struct person{

char name[30];
char mail[30];
char tele[30];

};

struct person p[MAX];

//========================-MAIN FUNCT-===============================================================
int main()
{

bool continue=true,exists=false;
int answer,i;
char filnme[20];

FILE *fil;

printf("Would you like to open an already existing file?[y/n]: ");
scanf("%d",&answer);
if(answer=='y'||answer=='Y')
{
    finns=true;
}
else finns=false;

getchar();

printf("\n\nType the name of the file you will use: ");
scanf("%s",filnme);

if(exists)
{

    fil = fopen(filnme,"rb");

    for(i=0;i<MAX;i++)
    {
        while(feof(fil)==0)
            {
            fread(&p, MAX, 1, fil);
            printf("%s %s %s\n",p.name,p.mail,p.tele);
        }

    }

    fclose(fil);
}

else fil = fopen(filnme,"wb");

do
{

    system("cls");

    int choice;

    printf("What would you like to do?");
    printf("\n_______________\n");
    printf("1. Add another person to the list\n");
    printf("2. Print the entire list\n");
    printf("3. Remove information from the list\n");
    printf("4. Sort\n");
    printf("5. Change information\n");
    printf("6. Search\n");
    printf("7. Exit\n");
    printf("\nChoice: ");
    scanf("%d",&choice);
    printf("\n");

    system("cls");

    switch(choice)
    {

        case 1:

        addtolist();
        getch();
        break;

        case 2:
        write();
        getch();
        break;

        case 3:
        remove();
        getch();
        break;

        case 4:
        sort();
        getch();
        break;

        case 5:
        change();
        getch();
        break;

        case 6:
        search();
        getch();
        break;

        case 7:
        continue=false;
        break;

        default:
        printf("Not a valid choice!");
        getch();
        break;

    }

}while(continue);

for(i=1;i<=MAX;i++)
{

        fwrite(&p, MAX, 1, fil);

}

fclose(fil);

system("cls");

}

Не берите в голову объявление функций или что-то в этом роде, я рассмотрел это, только обработку двоичных файлов, которую я положил в основную.

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Вы не используете fread и fwrite правильно.

fread(&p, MAX, 1, fil);

должно быть:

fread(&p[i], sizeof(person), 1, fil);

Аналогично для вызова fwrite.

Альтернативой вызову fread и fwrite в цикле является чтение / запись всего массива за один раз, например:

fread(&p, sizeof(person), MAX, fil);
0 голосов
/ 09 декабря 2011

Помимо прочего, scanf ("% d", & answer) пытается прочитать число, а не символ y / n.

0 голосов
/ 09 декабря 2011

continue - зарезервированное ключевое слово в C / C ++ - не используйте его в качестве логического имени переменной.

Финны не объявлены (предполагается, что это bool)

Вы не проверяете возвращаемое значение fopen. Как узнать, был ли файл успешно открыт?

Ваш цикл while на fread не выглядит нигде рядом.

Это выглядит намного лучше

int records_read = 0;
size_t count;

count = 0;
for (i = 0; i < MAX; i++)
{
    count = fread(&p[i], sizeof(p[i]), 1, fil);
    if (count == 0)
    {
        break;
    }
    records_read++;
}

То же самое для вашего цикла записи (обратите внимание, что я установил начальное значение "i")

for(i=0;i<MAX;i++)
{
    fwrite(&p[i], sizeof(p[i]), 1, fil);
}
...