gpt4 book ai didi

c - 为什么我的 fscanf 不读取?

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:21 24 4
gpt4 key购买 nike

我正在尝试将 file.txt 中的信息读入 BST。首先,我考虑将信息保存到临时迷你数组中,而不是将这些值分配给树节点。显然出了点问题,我确定一件事是不正确的正则表达式,可能是另一件事。请帮我弄清楚如何将数据保存到 BST,我这个项目真的来晚了。

输入 file.txt 中包含的数据示例:

3800 Lee, Victor; 2.8
3000 Brown, Joanne; 4.0
1300 South, Frankie; 2.6
4000 Trapp, Dave; 3.9

它们必须被读取并解析为:1)int= id, 2)char= name, 3)float= gpa

它们必须正确保存,没有任何符号,所以当我在下一个函数中进行搜索时,它不会给我任何错误。

下面是我的代码(已更新):

int readFile(BST_TREE *list) {
int id = 0;
int val = 0;
int ln = 0;
float gpa = 0.0;
char name[MAX_NAME_LEN];
STUDENT *stuptr = 0;
char line[MAX_LEN];

stuptr = (STUDENT*)malloc(sizeof(STUDENT));


FILE *fp = fopen("gpa.txt", "r");
if(fp == NULL) {
printf("Error in opening file\n");
return 1;
}

while (fgets(line, sizeof(line), fp)) {

ln++;
if (sscanf(line, "%d %[^;]; %f ", &id, name, &gpa) < 3) {
printf("Syntax error in line %d.\n", ln);
} else {
printf("1 %4d %-29s%f\n", id, name, gpa);
}
}

stuptr->id = id;
strcpy(stuptr->name, name);
(stuptr->gpa) = gpa;
return 0;
}

// Typedef
typedef struct
{
int id;
char name[MAX_NAME_LEN];
float gpa;
} STUDENT;

最佳答案

那是因为fscanf的格式串有误。您需要的是 "%d %[^;];%f "。这意味着

  1. 首先读取一个十进制整数并存储。
  2. 然后读取并丢弃任意数量的空白字符。
  3. 然后匹配除分号;之外的任意数量的所有字符并存储。写入字符的缓冲区必须足够大以容纳读取的字符加上 fscanf 添加的终止空字节。
  4. 然后匹配一个分号;并丢弃
  5. 然后读取一个浮点值,丢弃任意数量的前导空白字符。
  6. 然后读取并丢弃任意数量的空白字符。

如您所见,如果文件中的任何行格式错误,fscanf 将因匹配失败而失败,并可能将文件指针留在未知位置。

您应该使用 fgets 来读取一行,然后使用 sscanf 来处理该行并从中读取元素。这是您应该如何做的。但是,您必须事先知道文件中一行的最大长度。

您的代码片段中还有其他错误。

  1. 您正在分配内存来存储指针,而不是结构本身 -
    stuPtr = (STUDENT*)malloc (sizeof (stuPtr));
    您应该执行以下操作。也不要转换 malloc 的结果并检查其结果是否为 NULL -
    stuPtr = malloc(sizeof *stuPtr);

  2. 你不能给数组赋值。您应该复制数组的每个字符。此外,结构成员 name 是一个字符,而不是一个数组。
    stuPtr->name = tempName;
    在上面的语句中,tempName 是一个数组,它衰减为指向其第一个元素的指针。此指针分配给结构成员 name,这是一个字符 - 这显然是一个错误。您应该将结构成员 name 的类型更改为 char 数组。

这是一个修改后的版本,其中包含我建议的更改。

#define MAX_LEN 100
#define MAX_NAME_LEN 40

typedef struct {
int id;
char name[MAX_NAME_LEN];
float gpa;
} student;

void add_student(BST_TREE *list) {
int id, val;
float gpa;
char name[MAX_NAME_LEN]
student *stuptr;
char line[MAX_LEN];

FILE *fp = fopen("gpa.txt", "r")
if(fp == NULL) {
printf("error in opening file\n");
return 1;
}

while(fgets(line, sizeof line, fp) != NULL)
stuptr = malloc(sizeof *stuptr);
if(stuptr == NULL) {
printf("not enough memory to allocate\n");
return 1;
}
val = sscanf(line, "%d %[^;];%f", id, name, gpa)
if(val != 3) {
printf("input format error\n");
// handle it
}
stuptr->id = id;
strcpy(stuptr->name, name);
stuptr->gpa = gpa;
}
}

关于c - 为什么我的 fscanf 不读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com