文件处理:代码停止运行

时间:2017-08-30 15:32:44

标签: c++ c file-handling

#include <stdio.h>
main()
{
    FILE* fp;

    fp = fopen("a.text", "w+");

    int yes = 1, count = 0;

    char tree[30];

    while (yes) {
        printf("enter the name of the tree\n");
        scanf("%s", tree);
        fprintf(fp, "%s\n", tree);
        printf("do you want to enter more  trees?enter 0 if no and 1 if yes\n");
        scanf("%d", &yes);
        count++;
    }

    char treeArr[count][30];
    int i = 0;
    for (i = 0; i < count; i++) {
        fscanf(fp, "%s", &treeArr[i]);
        printf("%s", treeArr[i]);
    }

    fclose(fp);
}

这部分代码无效。

char treeArr[count][30];
int i = 0;
for (i = 0; i < count; i++) {
    fscanf(fp, "%s", &treeArr[i]);
    printf("%s", treeArr[i]);
}

我需要在文件中写入树的名称,然后将其放入字符串数组中,以便我可以计算每棵树的百分比。

这是个问题。请提供合适的解决方案。

1.当你沿着TU校园走路时,你会看到很多不同种类的树木。

园艺中心准备了从CSE部门到主门的每一棵树的清单。

您必须报告每种树种的百分比。

输入

  

您的计划的输入包括园艺部门观察到的每棵树的种类清单; .txt文件中每行一棵树。没有物种名称超过30个字符。

输出

  

打印TU中可用的每种树种的名称(按百分比排序),然后是它所代表的人口百分比。

2 个答案:

答案 0 :(得分:3)

问题是你的文件指针fp指向while循环(你写入文件的地方)之后的文件末尾。因此,后续的读取操作(fscanf)将立即返回EOF

您可以在读取文件之前将文件指针重置为开头:

fseek(fp, 0L, SEEK_SET);

如果错误检查您的图书馆电话(fopenscanffscanf等),您会注意到这一点。

答案 1 :(得分:0)

%s说明符取代char*,但您传递的是char (*)[30]。即使他们指向相同的记忆,他们也是不同的类型。

删除引用运算符

fscanf(fp,"%s",treeArr[i]);
               ^^^^^^^^^^

此外,您应该回滚/重置fp文件描述符的文件指针,在循环之后,指向文件末尾导致fscanf返回EOF的原因。

fseek(fp, 0L, SEEK_SET);
// Or
rewind(fp);