从文件中读取数据

时间:2011-04-27 21:46:46

标签: c file-io

我目前正在进行运行时检查失败#2 - 变量城市周围的堆栈已损坏。读取的输入文件格式如下:

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,然后创建了一个{p}}方法,将p插入insert()

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); } 插入到列表中,并尝试使用strcmp执行此操作。在使用此方法运行程序时,它会挂起并在第一次插入时停止执行。在person方法上寻找帮助我出错的地方。

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()

2 个答案:

答案 0 :(得分:4)

此:

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);

答案 1 :(得分:0)

我猜你的堆叠问题来自于尝试将更多字符放入state而不是它可以容纳。

您将state定义为能够容纳3个字符:2个常规字符和1个空终止符。当您提供示例输入时,fscanf语句尝试在该空间中写入8个字符(7个常规终结符和1个空终止符),用于3个字符。

这会调用所谓的undefined behaviour。未定义行为可以表现出来的一种方式是破坏变量。


修改

要将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 */