0

所以,我有一些代码可以逐行读取文件。
这是那个代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct alumnus {

    int *yearGraduated;
    char firstName[30];
    char lastName[30];

} Alumns;

void printer ( Alumns *a ) {

    printf("Year: %*d", a->yearGraduated);
    printf("  First Name: %s", a->firstName);
    printf("  Last Name: %s", a->lastName);

}

int main(int argc, const char * argv[])
{
    Alumns a;
    char *home = getenv("HOME");
    char path[100] = "/Desktop/Alumni.txt";
    strcat(home, path);
    FILE *fp;
    fp = fopen(home, "r");

    while ( fp ) {

     fscanf(fp, "%d,%s,%s", a.yearGraduated, a.firstName, a.lastName);
     printer(&a);
    }

    return 0;

}

我在打印机功能的第 2 行收到错误

printf("Year: %d", a->yearGraduated);

我的 IDE 对这一行说了以下内容:
格式指定类型“int”,但参数的类型为“int *”

另一个错误仅在我编译代码时出现。错误在行:

a.yearGraduated, a.firstName, a.lastName);

我的 IDE 对此进行了说明:
线程 1:EXC_BAD_ACCESS (code=1, address=0x0)

是的,该文件存在,是的,它的格式正确。
关于如何调试的任何想法?
有人建议我使结构内的 int 不是指针,但我不确定。

4

2 回答 2

2

yearGraduate 是一个指针。您需要为其分配空间并在 printf 语句中取消引用它。

所以...

 a.yearGraduated = malloc(sizeof(int));

 fscanf(fp, "%d,%s,%s", a.yearGraduated, a.firstName, a.lastName);

 free(a.yearGraduated);

并在函数中

 printf("Year: %d", *a->yearGraduated);

或者您可以使结构中的 int 不是指针,这不会成为问题。

于 2013-10-20T14:39:02.763 回答
1

关于第一个错误:您需要的所有信息都在错误消息中。您提供一个指向intwhereprintf的指针int。除非您有理由制作yearGraduated指针,否则您应该将其更改为int

typedef struct alumnus{
    int yearGraduated;
    ...
} Alumns;

如果这样做,您需要将第一个参数更改fscanf为传递a.yearGraduated:的地址&a.yearGraduated

如果您选择将其保留为指针,则必须分配它:

Alumns a;
a.yearGraduated = malloc(sizeof a.yearGraduated);

然后在打印机中,您必须将其取消引用printf

printf("Year: %*d", *a->yearGraduated);

代码崩溃的原因fscanf是因为内存a.yearGraduated没有分配所以fscanf试图写入未分配的内存,这是一个坏主意。

添加:(回应您的评论)

程序永远循环的原因是因为while(fp)将永远循环(除非fopen失败,在这种情况下它根本不会循环)。我假设您的推理是,fp当到达流的末尾时,这将变为错误。但是fp只是一个(指针)值,fscanf不会(不能)改变它。要在到达流的末尾时停止循环,请使用feof

于 2013-10-20T14:46:49.117 回答