Открытие двоичного файла в функции? Смотрите код: - PullRequest
0 голосов
/ 02 декабря 2011

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

void fun1 (int amount,struct inventory a[],FILE *fp);

int main()
{
    tag a[10];
    int amount;
    int i;
    FILE *fp;

    fp=fopen("e:\\invent.txt","wb");

    printf("How many items do you want to enter? ");
    scanf("%d",&amount);
    for(i=1;i<=amount;i++)
    {
        printf("Enter the name of the item: ");
        scanf("%s",a[i].name);
        printf("Enter the unit amount the item has: ");
        scanf("%d",&a[i].num);
        printf("Enter the unit price for the item: ");
        scanf("%f",&a[i].price);
        fwrite(&a[i],sizeof(a[i]),amount,fp);
    }
    fclose(fp);
    fun1(amount,a,fp);           
}

^^ Это мой ввод плюс мой вызов функции ^^.

Мой вклад:

Сколько предметов вы хотите ввести? 2
Введите название предмета: Молоток
Введите количество единиц товара: 32
Введите цену за единицу товара: 11
Введите название предмета: Гвозди
Введите количество единиц товара: 43
Введите цену за единицу товара: 12

void fun1 (int amount,struct inventory a[],FILE *fp)
{
    int i;
    fp=fopen("e:\\invent.txt","rb");
    while(fread(&a[amount],sizeof(tag),amount,fp) == amount)
    {
        printf("\nItem\tUnit #\tPrice\n");
        for(i=1;i<=amount;i++)
        {
            printf("\n%s\t%d\t%.2f",a[i].name,a[i].num,a[i].price);
        }
    }
    fclose(fp);
    getchar();

}

^^ Моя функция ^^

Мой вывод:

Единица измерения № Цена

Молот 32 11.00

Молот 32 11,00

Единица измерения № Цена

Молот 32 11,00

Гвозди 43 12,00

Не следует печатать «Молоток» дважды. Только жирный должен быть напечатан. Если вы можете дать мне ссылку или у вас есть совет, мы будем очень благодарны!

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

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

Измените этот цикл на

for (i = 0; i < amount; i++) 
0 голосов
/ 02 декабря 2011

проблема в вашем методе fun1, я пытаюсь собрать весь список, но вы указываете размер структуры, чтобы он мог читать до первой структуры

попробуйте это:

void fun1 (FILE *fp)
{

    _tag a;
    fp=fopen("e:\\invent.txt","rb");
    while(fread(&a,sizeof(_tag),1,fp) == 1)
    {
        printf("\nItem\tUnit #\tPrice\n");


        printf("\n%s\t%d\t%d",a.name,a.num,a.price);


    }
    fclose(fp);

}
...