Чтение данных из файла - PullRequest
0 голосов
/ 28 апреля 2011

В настоящее время я получаю ошибку проверки # 2 во время выполнения - стек вокруг переменной city поврежден.Читаемый входной файл отформатирован следующим образом:

Betty, 12 Main Street, North Elmo, NC 29801, 2000.20
Joe, 16 Maple Blvd., Stumptown, GA, 33125, 4000.40
Frank, 100 Avent Ferry, Raleigh, NC 27606, -3000.30

Как я могу исправить эту ошибку?

int main(int argc, char *argv[]) {
    int c, i, zip;
    FILE *fp;
    char name[20], address[50], city[19], state[3];
    float balance;

    for (i = 1; i < argc; i++) {
        fp = fopen(argv[i], "r");
        if (fp == NULL) {
            fprintf(stderr, "cat: can't open %s\n", argv[i]);
            continue;
        }

        while ((c = getc(fp)) != EOF) {
            fscanf(fp, "%s%s%s%s%d%f", &name, &address, &city, &state, &zip, &balance);
        }

        printf("%s%s%s%s%d%f\n", name, address, city, state, zip, balance);
        fclose(fp);
    }

    return 0;
}

Обновление:

Спасибо за помощьдо сих пор.Теперь я создал struct с каждым person в структуре, содержащей имя, адрес и баланс.Я просто изменил предыдущие операторы для передачи переменных в struct person p, а затем создал метод insert(), который вставляет p в struct person list.

while (fgets(line, sizeof(line), fp) != NULL) {
        p = malloc(sizeof(struct person));
        sscanf(line, "%19[^,], %49[^,], %18[^,], %2[^ ] %d, %lf\n", p->name, p->address, p->city, p->state, &p->zip, &p->balance);
        printf("got [%s], [%s], [%s], [%s], [%d] and [%9.2f].\n", p->name, p->address, p->city, p->state, p->zip, p->balance);
        insert(p);
    }

Я пытаюсь вставить person всписок в алфавитном порядке и попытался сделать это с помощью strcmp.После запуска моей программы этим методом она зависает и останавливает выполнение при первой вставке.Нужна помощь в том, где я ошибся в своем методе insert().

void insert(struct person *p) {
struct person *cur, *prev;
int result = 0;

for (cur = list, prev = NULL, result = strcmp(p->name, cur->name); cur != NULL && result > 0; prev = cur, cur = cur->next, result = strcmp(p->name, cur->name));

if (cur != NULL && result == 0) {
    printf("-------------------------\n"
        "DUPLICATE RECORD: %s\n"
        "-------------------------\n", p->name);
    free(p);
    return;
}

p->next = cur;
if (prev == NULL) {
    list = p;
}
else {
    prev->next = p;
}
}

Я протестировал этот метод без strcmp().Я только что сравнил с p->name > cur->name, и он смог вставить и распечатать список очень хорошо с моим print() методом.Единственная проблема заключалась в том, что люди не сортировались по алфавиту, поэтому я вернулся и попытался внедрить strcmp().

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

Это:

fscanf(fp, "%s%s%s%s%d%f", &name, &address, &city, &state, &zip, &balance);

должно быть:

fscanf(fp, "%s%s%s%s%d%f", name, address, city, state, &zip, &balance);
0 голосов
/ 28 апреля 2011

Полагаю, ваша проблема в стеке связана с попыткой поместить в state больше символов, чем может вместить.

Вы определили state как способный удерживать 3 символа: 2 обычных символа и 1 нулевой терминатор.Ваш оператор fscanf, представленный с примером ввода, пытается написать 8 символов (7 обычных и 1 нулевой терминатор) в этом пространстве для 3 символов.

Это вызывает то, что называется undefinedповедение .Один из способов неопределенного поведения может проявиться в повреждении переменных.


Редактировать

Чтобы ограничить scanf фиксированным числом символов, используйте поле максимумаширина в спецификации преобразования:

char buf[42];
scanf("%41s", buf); /* reads at most 41 non whitespace characters to `buf`
                    ** and appends a null terminator,
                    ** for a maximum total of 42 characters */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...