Вводит неверные данные в начале - PullRequest
0 голосов
/ 11 февраля 2019

Мой входной файл, содержащий коллекцию товаров в этом формате:

name
price
symbol

Пример файла:

Ball
6.24
u

Я хочу прочитать файл, разобрать текст в struct ипереписать файл с теми же элементами, но без элементов с символом u.Это мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>

struct Product
{
    char name[30];
    char amount;
    double price;
};

int main()
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    struct Product products[100];

    fp = fopen("magazyn.txt", "r+");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    int counter = 0;
    int amount = 0;
    while ((read = getline(&line, &len, fp)) != -1) {
        if (counter != 0 && counter % 3 == 0)
        {
            counter = 0;
            amount++;
        }

            if (counter % 3 == 0) {
                strcpy(products[amount].name, line);
            }

            if (counter % 3 == 1)
                products[amount].price = atof(line);

            if (counter % 3 == 2)
                products[amount].amount = line[0];

        counter++;
    }

    truncate("magazyn.txt", 0);

    for(int i=0; i<amount; i++)
    {
        if (products[amount].amount != 'u') 
        {
            fprintf(fp, "%s\n%lf\n%c\n", 
            products[amount].name,
            products[amount].price,
            products[amount].amount);
        }
    }

    fclose(fp);

    if (line)
        free(line);

    return 0;
}

Почему-то я получаю \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00Ball.Почему это происходит?

1 Ответ

0 голосов
/ 11 февраля 2019

Код читает некоторые строки из файла, затем добавляет новые строки в тот же файл (да, он добавляется, см. Ниже).

Вызов truncate() устанавливает размер файла равным 0 в файловой системе.Но это не сбрасывает текущее смещение файла для открытого файла.

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

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