为什么我看不到输入的文本文件?

时间:2020-05-22 09:30:07

标签: string file pointers scanf fopen

我尝试使用scanf读取文件名,但失败。 我的指针非常糟糕,找不到问题。 指向字符串数组的指针有问题吗? 这是我的代码:

int* Read_file(char* str[])
{
    FILE* fp = fopen(str[1], "r");
    if(fp == NULL)
    {
        printf("File cannot open\n");
        return NULL;
    }
    int rows = 0;
    while(!feof(fp))
    {
        if(fgetc(fp) == '\n')
        {
            rows ++;
        }
    }
    rows ++;
    int* keys = (int*)malloc(3 * rows * sizeof(int));
    fseek(fp, 0L, 0);
    while(!feof(fp))
    {
        for(int i = 0;i < rows;i ++)
        {
            for(int j = 0;j < 3;j ++)
            {
                fscanf(fp,"%d", &keys[(3 * i) + j]);
            }
        }
    }
    fclose(fp);
    return keys;
}
int main()
{
    char* str[20];
    printf("Build_tree ");
    scanf("%s",&str);
    int* keys = Read_file(str);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

好的,事情是这样的:

您需要一个char数组来存储字符串(文件名)。因此,您应该使用char数组。相反,您使用的是char指针数组。

数组实际上是一系列存储块。数组的名称表示一个指向数组第一个元素的指针(在本例中为第一个char变量)。

在读取字符串时,scanf需要一个存储它的位置。因此,您需要为其提供char数组的第一个char变量的地址,该变量在char数组本身中可用。因此,您只需将str传递给scanf。对于普通的intfloat以及此类基本数据类型,其名称代表存储块,而不是指向存储块的指针,因此您必须使用&

然后对于fopenfopen需要一个char*(指向存储文件名的char数组的第一个字符),您必须为其提供一个{{1} }。因此,您应该通过char*

我认为您的代码应该像

str

评论任何查询。

相关问题