用奇怪的字符读取输入文件

时间:2016-03-13 09:30:52

标签: c

我在这里有这个功能,它以下列格式读取文件:

(badgeno)
(name)
(location) // until it hits *
(birthday)

我通过程序在txt文件中添加了一条记录: 注意:我在关闭程序后检查了文件,在我再次打开程序之前,它的编写完全相同。

5432
Janna Wind
3321 Jupiter St
44324, Fi, CA
*
1990

然而,当我打开程序并打印记录时,它显示如下:

5432
Janna Wind
!34^&32()93321 Jupiter St
44324, Fi, CA
1990

当我检查txt文件后,我将其存储到关闭程序之后,它看起来像这样:

5432
Janna Wind
!34^&32()93321 Jupiter St
44324, Fi, CA
*
1990

我假设我的'while(fgets ......')对于该位置一定有问题,但我无法弄清楚原因。奇怪的字符意味着它从我没有指定的地址读取数据或这样的事情对不对?如果我听起来很混乱,我很抱歉。

int readfile(struct test ** start, char filename[]){

FILE *fp = NULL;
fp = fopen(filename,"r");

int badgeno;
char fullname[45];
char location[100];
int birthday;
char line[80];
int opened = 1;

if (fp == NULL){

    opened = 1;

} else {

    opened = 0;

    while (fscanf(fp, "%d\n", &badgeno) > 0) {

        fgets(fullname, 45, fp);

        strncpy(location, line, sizeof(line));

        while (fgets(line, 80, fp)) {
            if (strcmp(line, "*\n") == 0) {
                line[0] = '\0';
                break;
            }
            strncat(location, line, 79 - strlen(location));
        }

        fscanf(fp, "%d[^\n]", &birthday);

        addRecord(start, badgeno, fullname, location, birthday);
    }
}

fclose(fp);
return opened;
}

我知道我的代码很乱,所以请原谅。但是,当我再次重新打开程序时,可能会导致这些奇怪的角色出现。我的fgets行可能是代码中的问题吗?

1 个答案:

答案 0 :(得分:2)

这是你的问题:

strncpy(location, line, sizeof(line));

使用此行,您可以将(未初始化的!)数组line复制到location。由于line未初始化,其内容为 indeterminate ,您将获得未定义的行为

相反,您应该“清除”location数组,以便稍后在循环中追加它。定义location数组时,这是最简单的方法:

char location[100] = { 0 };

这会将location的所有元素设置为零,这是字符串终止符。