【问题标题】:Why can‘t I read the input text file?为什么我无法读取输入文本文件?
【发布时间】:2020-09-09 02:37:06
【问题描述】:

我尝试使用 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;
}

【问题讨论】:

  • 执行时到底发生了什么?
  • 我试图打印键中的数字(上面的代码中没有显示),但什么也没显示。我确定我在命令行输入的txt文件不是空的,里面有9个数字。
  • 能否附上文件内容
  • 1 2 3 2 4 5 3 6 7

标签: string file pointers scanf fopen


【解决方案1】:

好的,事情是这样的:

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

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

读取字符串时,scanf 需要一个位置来存储它。所以你需要给它你的char数组的第一个char变量的地址,它在你的char数组本身中可用。所以你必须将str 传递给scanf。对于普通的intfloat 和这样的基本数据类型,它们的名称代表内存块而不是指向内存块的指针,因此您必须使用&amp;

那么对于fopenfopen 需要一个 char*(它指向存储文件名的 char 数组的第一个字符)并且您必须为其提供一个 char* 。所以你应该通过str

我认为你的代码应该是这样的

int* Read_file(char str[])
{
    FILE* fp = fopen(str, "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);

    //Whatever you want to do with the keys

    return 0;
}

对任何查询发表评论。

【讨论】:

  • 嘿,我更正了一个错误。将Read_file 定义标头中的char* str[] 更改为char str[]
  • 你能用问题中的文件发布你的整个代码吗?
  • 顺便说一句,你是如何打印密钥的?
  • 对不起,我忘了改一行代码。您的代码现在可以正常工作了。非常感谢!
  • 如果您觉得我的回答有帮助,请考虑点赞并将其标记为正确答案。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2020-01-02
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多